如何重载 except() 方法以仅比较行集合中的第一个字段?如果我在下面的两个查询中的列数不相等(一个 qry 中的额外字段但另一个没有)怎么办?
我已经阅读了一些与我类似的自定义相等比较器问题,但找不到我的解决方案的确切答案。
请帮助我编写重载代码,因为我是 except 方法的新手。
//Pass in your two datatables
//build the queries based on id and name.
var qry1 = datatable1.AsEnumerable().Select(a => new { ID = a["ID"].ToString(), Name = a["NAME"].ToString() });
var qry2 = datatable2.AsEnumerable().Select(b => new { ID = b["ID"].ToString(), Name = b["NAME"].ToString() });
//detect row deletes - a row is in datatable1 except missing from datatable2
var exceptAB = qry1.Except(qry2);
//detect row inserts - a row is in datatable2 except missing from datatable1
var exceptAB2 = qry2.Except(qry1);
//then I execute my code here
if (exceptAB.Any())
{
foreach (var id in exceptAB)
{
//print to console id and name
}
}
if (exceptAB2.Any())
{
foreach (var id in exceptAB2)
{
//print to console id and name
}
}
编辑:我通过使用 linq 查询解决了这个问题。我已经将 ID 存储在一个变量中,所以我只是使用 Contains() 来提取我需要的额外字段。
var vProjectSummary = from a in dt1.AsEnumerable()
where sDelProjSummCheck.Contains(a.Field<string>("ID"))
select new
{
INV_ID = a.Field<string>("ID"),
It_Group = a.Field<string>("IT_GROUP"),
L6 = a.Field<string>("L6"),
Test_Mgr = a.Field<string>("TEST_MGR"),
INV_NAME = a.Field<string>("INV_NAME")
};
//
//
//
var vInsProjectSummary = from a in dt2.AsEnumerable()
where sInsProjSummCheck.Contains(a.Field<string>("ID"))
select new
{
INV_ID = a.Field<string>("ID"),
INV_NAME = a.Field<string>("INV_NAME")
};