C# Linq 中的嵌套选择
本文关键字:嵌套 选择 Linq | 更新日期: 2023-09-27 18:32:24
我是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();
该列表会检索所有主条目,但"详细信息"计数始终为零。因此,嵌套选择不起作用。请帮忙!谢谢。
正如托马斯所说,
使用 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 d["ItemId"] == m["ItemId"]
到任一
where Equals(d["ItemId"], m["ItemId"])
或
where d.Field<int>("ItemId") == m.Field<int>("ItemId")