2012-04-02 2 views
0

Я новичок в linq.Каким должен быть тип переменной?

Мой код такой, как показано ниже. Мне нужно указать тип для переменной результатов. Что это должно быть?

Я пробовал с присваиванием results= Enumerable.Emoty<DataRow>(); и произведением к DataRow. Но кастинг провалился.

Может ли кто-нибудь сказать это?

var results; 

     if (rbtnSystemTypes.IsChecked == true) 
     { 
      results = (from DataRow dr in objDataTable.Rows 
         let Markets = dr.Field<bool>("IsActiveMarkets") == true ? "Active" : "Inactive" 
         let Budgets = dr.Field<bool>("IsActiveBudgets") == true ? "Active" : "Inactive" 
         let Programs = dr.Field<bool>("IsActivePrograms") == true ? "Active" : "Inactive" 
         select new 
         { 
          SlNo = objDataTable.Rows.IndexOf(dr) + 1, 
          Country = dr.Field<string>("SystemType"), 
          Market = dr.Field<string>("Market"), 
          ProgramType = dr.Field<string>("JDFType"), 
          Markets = Markets, 
          Budgets = Budgets, 
          Programs = Programs 
         }); 

     } 
     else 
     { 
      results = (from DataRow dr in objDataTable.Rows 
         let Markets = dr.Field<bool>("IsActiveMarkets") == true ? "Active" : "Inactive" 
         let Budgets = dr.Field<bool>("IsActiveBudgets") == true ? "Active" : "Inactive" 
         let Programs = dr.Field<bool>("IsActivePrograms") == true ? "Active" : "Inactive" 
         select new 
         { 
          SlNo = objDataTable.Rows.IndexOf(dr) + 1, 
          SubSystemType = dr.Field<string>("SubSystem"), 
          Market = dr.Field<string>("Market"), 
          SystemType = dr.Field<string>("SystemType"), 
          Markets = Markets, 
          Budgets = Budgets, 
          Programs = Programs 
         }); 
     } 
+1

Ожидаете ли вы магического приведения от анонимного объекта к DataRow? Если это так, вам не повезло. – leppie

ответ

1

Вы создаете в ваших select статей в anonymous type - они не имеют никакого определенного имени (следовательно анонимный).

Создайте класс для хранения результатов и используйте это как тип результатов.

public MarketData 
{ 
    public int SlNo { get; set; } 
    public string SubSystemType { get; set; } 
    ... 
} 

// in the queries: 
select new MarketData 
{ 
    SlNo = objDataTable.Rows.IndexOf(dr) + 1, 
    ... 
} 
+0

И как это вписывается в требование DataRow вопроса? – leppie

+0

@leppie - Мое прочтение вопроса заключается в том, что OP _tried_ кастинг в DataRow' как часть его неудачных попыток приведения к известному типу, а не в том, что это требование. – Oded

0

Это анонимный вид.

Вы можете создать класс с одинаковыми полями и вернуть его, если хотите.

или вы можете получить метод для возврата динамического (вы потеряете проверки типа intellisense и типа компилятора).

0

если я не хватает чего-то это анонимный тип

вы не можете бросить его, вам нужно создать пользовательский класс и сделать

select new MyNewClass() 
        { 
         SlNo 
0

Это будет анонимный тип, характеризуется особенно LINQ , IMHO - лучшая практика - вернуть результат. ToList().

1

Вы можете использовать dynamic, но прощайтесь с матерью и проверяйте время проверки.

dynamic results; 

Единственный раз, когда я делаю это, когда я делаю быстрые и грязные запросы LINQPad, и я не хочу идти на усилия по созданию класса для него.

Смежные вопросы