2012-04-26 104 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 
} 

我的视图模型具有

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”]'返回什么?也许'=='不是正确的比较器。 – Thomas 2012-04-26 14:35:51

+1

我试过m.Field (“ItemId”)== d.Field (“ItemId”)。那也没用。 – pj123 2012-04-26 14:39:08

+0

尝试:其中d.Field (“ItemId”)== m.Field (“ItemId”) – graver 2012-04-26 14:41:52

回答

0

正如托马斯说,

当您访问使用行字段

[“列名”]语法,值类型被装箱。这样==运算符就引用了比较,而不是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条件

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

要么

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

where d.Field<int>("ItemId") == m.Field<int>("ItemId")