C# 比较2个Datatable中的行的唯一组合&;使用LINQ查找它们是否相同

C# 比较2个Datatable中的行的唯一组合&;使用LINQ查找它们是否相同,c#,.net,linq-to-entities,C#,.net,Linq To Entities,数据集oDs=新数据集(); DataTable odt=新DataTable() odt.Columns.Add(新的DataColumn(“FILE_ID”,typeof(string)); Add(新的DataColumn(“ID”,typeof(string)); oDs.表格.增补(odt); oDs.AcceptChanges(); 对于(int i=1;i

数据集oDs=新数据集(); DataTable odt=新DataTable()

odt.Columns.Add(新的DataColumn(“FILE_ID”,typeof(string));
Add(新的DataColumn(“ID”,typeof(string));
oDs.表格.增补(odt);
oDs.AcceptChanges();
对于(int i=1;i<3;i++)
{
DataRow oDr=oDs.Tables[0].NewRow();
oDr[“文件ID”]=“a”+i;
oDr[“ID”]=“b”+i;
oDs.Tables[0].Rows.Add(oDr);
}
对于(int i=1;i<3;i++)
{
DataRow oDr=oDs.Tables[0].NewRow();
oDr[“文件ID”]=“c”+i;
oDr[“ID”]=“d”+i;
oDs.Tables[0].Rows.Add(oDr);
}
oDs.AcceptChanges();
DataTable odt1=新DataTable();
Add(新的DataColumn(“FILE_ID”,typeof(string));
Add(新的DataColumn(“ID”,typeof(string));
oDs.表格.增补(odt1);
oDs.AcceptChanges();
对于(int i=1;i<3;i++)
{
DataRow oDr=oDs.Tables[1].NewRow();
oDr[“文件ID”]=“a”+i;
oDr[“ID”]=“b”+i;
oDs.Tables[1].Rows.Add(oDr);
}
对于(int i=1;i<3;i++)
{
DataRow oDr=oDs.Tables[1].NewRow();
oDr[“文件ID”]=“c”+i;
oDr[“ID”]=“d”+i;
oDs.Tables[1].Rows.Add(oDr);
}
oDs.AcceptChanges();

我需要一个LINQ查询,通过它我可以找到行(FILE_ID+ID)的值的组合是否唯一&如果它们在两个数据表中都相同,这将获得非唯一值:

var notUnique = odt.AsEnumerable()
                            .GroupBy(x => (string) x["FILE_ID"] + x["ID"])
                            .Where(g => g.Count() > 1);
在这里可以找到在一个表中但在另一个表中找不到的值

您的具体案例如下所示:

  var differentRows =
            odt.AsEnumerable().Where(
                o =>
                odt1.AsEnumerable().All(
                    o1 => ((string) o["FILE_ID"] + o["ID"]) != ((string) o1["FILE_ID"] + o1["ID"])))
                .Union(odt1.AsEnumerable().Where(
                o1 => odt.AsEnumerable().All(o => ((string)o["FILE_ID"] + o["ID"]) != ((string)o1["FILE_ID"] + o1["ID"]))));

请记住,这类似于“except”方法,其中重复记录不会显示为差异。但由于您正在检查上面的重复项,因此我假定不需要进一步检查。

您有两个表。每个都有多行。因此,对于给定的表,您希望合并行值(FILE_ID+ID),并将其与该表的其他行进行比较,以确定所有结果是否唯一?此外,您想确保两个表具有相同的内容吗?我不想连接两行,但行中的值组合必须是唯一的,并且为了确保两个表具有相同的行组合,在任何列中没有DBNull值之前,此查询是正确的。如果意外地在任何数据表中出现任何DBNULL.Value,则会出现问题。
  var differentRows =
            odt.AsEnumerable().Where(
                o =>
                odt1.AsEnumerable().All(
                    o1 => ((string) o["FILE_ID"] + o["ID"]) != ((string) o1["FILE_ID"] + o1["ID"])))
                .Union(odt1.AsEnumerable().Where(
                o1 => odt.AsEnumerable().All(o => ((string)o["FILE_ID"] + o["ID"]) != ((string)o1["FILE_ID"] + o1["ID"]))));