C# C Linq中的嵌套选择

C# C Linq中的嵌套选择,c#,linq,C#,Linq,我是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{

我是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();   
列表确实检索所有主项,但详细信息计数始终为零。因此,嵌套的select不起作用。请帮忙!谢谢。

正如托马斯所说

使用行[columnName]语法访问字段时,值类型将被装箱。这样一来,==运算符引用比较,而不是比较实际值的等于

考虑以下代码

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"])


d[ItemId]返回什么?可能==不是正确的比较器。我也尝试过m.FieldItemId==d.FieldItemId。try:其中d.FieldItemId==m.FieldItemId我的观点是比较器可能不正确。也许你需要使用。如果要取回引用类型而不是值类型,则==仅当它们是字面上相同的对象时才会匹配,而不仅仅是表示相同值的两个对象。
where d.Field<int>("ItemId") == m.Field<int>("ItemId")