C# 在LINQ的动态表达式和查询中使用DefaultIfEmpty
我想与DefaultIfEmpty子句一起使用,以获取两个集合中不匹配或不匹配的所有行。最终目标是获得两个表的联接的增量 在表A中,我有:C# 在LINQ的动态表达式和查询中使用DefaultIfEmpty,c#,linq,dynamic-expression,C#,Linq,Dynamic Expression,我想与DefaultIfEmpty子句一起使用,以获取两个集合中不匹配或不匹配的所有行。最终目标是获得两个表的联接的增量 在表A中,我有: Name | Description | Type A | This is something | 1 B | Something else | 2 C | Where have I gone | 1 在表B中,我有: Name | Description | Type A | This is som
Name | Description | Type
A | This is something | 1
B | Something else | 2
C | Where have I gone | 1
在表B中,我有:
Name | Description | Type
A | This is something | 1
B | Life is wonderful | 2
D | What happened to C | 2
我希望得到以下结果:
Column | Table A | Table B
Name | B | B
Description | Something else | Life is wonderful
Type | 2 | 2
---
Column | Table A | Table B
Name | C | null
Description | Where have I gone | null
Type | 2 | null
---
Column | Table A | Table B
Name | null | D
Description | null | What happened to C
Type | null | 2
这个答案不使用动态表达式。然而,正是我提出的解决方案,给了我我正在寻找的答案
var sql = table.SqlSelect;
var dataLegacy = GetData(connections.Legacy, sql, table.TableName);
var dataUpdate = GetData(connections.Update, sql, table.TableName);
var compare = new List<CompareSet>();
var jsonColumns = table.Json.ToList() ?? null;
dataLegacy.AsEnumerable().ToList()
.ForEach(legacyRow =>
{
DataRow updateRow = default(DataRow);
if (table.KeyColumn.Any())
{
var keys = string.Join("|", table.KeyColumn.Select(kc => $"{legacyRow.Field<object>(kc)}"));
updateRow = dataUpdate.AsEnumerable()
.FirstOrDefault(y => keys == string.Join("|", table.KeyColumn.Select(kc => $"{y.Field<object>(kc)}")));
}
if (updateRow == null || JsonConvert.SerializeObject(legacyRow.ItemArray) != JsonConvert.SerializeObject(updateRow.ItemArray))
compare.Add(new CompareSet(compare.Count, legacyRow, updateRow, jsonColumns));
});
dataUpdate.AsEnumerable().ToList()
.ForEach(updateRow =>
{
DataRow legacyRow = default(DataRow);
if (table.KeyColumn.Any())
{
var keys = string.Join("|", table.KeyColumn.Select(kc => $"{updateRow.Field<object>(kc)}"));
legacyRow = dataLegacy.AsEnumerable()
.FirstOrDefault(y => keys == string.Join("|", table.KeyColumn.Select(kc => $"{y.Field<object>(kc)}")));
}
if (legacyRow == null)
compare.Add(new CompareSet(compare.Count, legacyRow, updateRow, jsonColumns));
});
if (compare.Any())
{
compare.OrderBy(c => c.OrderBy)
.Dump($"{table.SchemaTable} ( {compare.Count()} / {dataLegacy.Rows.Count} / {dataUpdate.Rows.Count} rows )", TableDumpDepth);
}
else
{
"No differences found in data".Dump($"{table.SchemaTable} ( 0 / {dataLegacy.Rows.Count} / {dataUpdate.Rows.Count} rows )");
}
var sql=table.SqlSelect;
var dataLegacy=GetData(connections.Legacy、sql、table.TableName);
var dataUpdate=GetData(connections.Update、sql、table.TableName);
var compare=新列表();
var jsonColumns=table.Json.ToList()??无效的
dataLegacy.AsEnumerable().ToList()
.ForEach(legacyRow=>
{
DataRow updateRow=默认值(DataRow);
if(table.KeyColumn.Any())
{
var keys=string.Join(“|”,table.KeyColumn.Select(kc=>$”{legacyRow.Field(kc)}”);
updateRow=dataUpdate.AsEnumerable()
.FirstOrDefault(y=>keys==string.Join(“|”),table.KeyColumn.Select(kc=>$”{y.Field(kc)}”);
}
if(updateRow==null | | JsonConvert.SerializeObject(legacyRow.ItemArray)!=JsonConvert.SerializeObject(updateRow.ItemArray))
添加(新的CompareSet(compare.Count、legacyRow、updateRow、jsonColumns));
});
dataUpdate.AsEnumerable().ToList()
.ForEach(updateRow=>
{
DataRow legacyRow=默认值(DataRow);
if(table.KeyColumn.Any())
{
var keys=string.Join(“|”,table.KeyColumn.Select(kc=>$”{updateRow.Field(kc)}”);
legacyRow=dataLegacy.AsEnumerable()
.FirstOrDefault(y=>keys==string.Join(“|”),table.KeyColumn.Select(kc=>$”{y.Field(kc)}”);
}
if(legacyRow==null)
添加(新的CompareSet(compare.Count、legacyRow、updateRow、jsonColumns));
});
if(compare.Any())
{
compare.OrderBy(c=>c.OrderBy)
.Dump($“{table.SchemaTable}({compare.Count()}/{dataLegacy.Rows.Count}/{dataUpdate.Rows.Count}Rows)”,TableDumpDepth);
}
其他的
{
“在data.Dump中未发现差异($”{table.SchemaTable}(0/{dataLegacy.Rows.Count}/{dataUpdate.Rows.Count}行)”);
}
您的结果代表什么?三张桌子?一个具有重复列值的表?(那么您打算如何将名称
与描述
匹配?)您自己有没有尝试过什么?