2012-04-26 2 views
4

Я новичок в Linq и не смог получить эту работу.Вложенный выбор в C# Linq

public class ItemMaster 
{ 
    public int ItemId{ get; set; } 
    //other fields 
    public IList<ItemDetail> Details { get; set; }  
} 

public class ItemDetail 
{ 
    public int DetailId{ get; set; } ; 
    public int ItemId{ get; set; } ; 
    //other fields 
} 

Мои ViewModel имеет

DataTable dtMaster = da.GetItemsMasterDataTable(); 
DataTable dtDetail = da.GetItemsDetailDataTable(); 

var list = (from m in dtMaster.AsEnumerable()             
      select new ItemMaster 
      { 
       ItemId = m.Field<int>("ItemId"), 
       //other fields 
       Details = (from d in dtDetail.AsEnumerable() 
         where d["ItemId"] == m["ItemId"] 
         select new ItemDetail 
         { 
          DetailId = d.Field<int>("DetailId"), 
          ItemId = d.Field<int>("ItemId") 
          //other fields 
          }).ToList() 
      }).ToList(); 

В списке действительно получит все основные элементы, но отсчитывать детали всегда равен нулю. Таким образом, вложенный выбор не работает. Пожалуйста помоги! Благодарю.

+1

Что возвращает 'd [" ItemId "]' return? Возможно, '==' не является правильным компаратором. – Thomas

+1

Я пробовал m.Field ("ItemId") == d.Field ("ItemId"). Это тоже не работало. – pj123

+0

try: где d.Field ("ItemId") == m.Field ("ItemId") – graver

ответ

0

Как Томас говорит,

при доступе к полям, использующим строку [ «ColumnName»] синтаксис, типы значений зажаты. Таким образом, оператор == выполняет ссылку сравнения, а не Equals, которая сравнивает фактические значения.

Рассмотрим следующий код

object foo = 1; 
object bar = 1; 

// outputs False 
Console.WriteLine(foo == bar); 
// outputs True 
Console.WriteLine(foo.Equals(bar)); 
// outputs True 
Console.WriteLine((int)foo == (int)bar); 

Так изменить где состояние от

where d["ItemId"] == m["ItemId"] 

либо

where Equals(d["ItemId"], m["ItemId"]) 

или

where d.Field<int>("ItemId") == m.Field<int>("ItemId") 
Смежные вопросы