C# Linq中的嵌套查询

4

我对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"] 返回什么?也许 == 不是正确的比较器。 - Thomas
1
我也尝试了 m.Field<int>("ItemId") == d.Field<int>("ItemId"),但那也不起作用。 - pj123
尝试:其中d.Field<int>("ItemId") == m.Field<int>("ItemId")。 - graver
1
我的意思是比较器可能不正确。也许你需要使用.Equals。如果你得到的是引用类型而不是值类型,==只会匹配字面上相同的对象,而不是代表相同值的两个对象。 - Thomas
1个回答

0

正如Thomas所说,

当您使用row ["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 条件从以下内容更改:

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

要么

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

或者

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接