【问题标题】:LINQ joining two tables using string columnsLINQ 使用字符串列连接两个表
【发布时间】:2015-09-16 15:52:32
【问题描述】:

我正在尝试比较两个表。我想找出table1 中存在哪些行,而table2 中不存在哪些行。 oDataoDataiSeries 是 DataTables,并正确填充。

var testing = from table1 in oData.AsEnumerable()
                          join table2 in oDataiSeries.AsEnumerable() on table1.Field<string>("SLOT") equals table2.Field<string>("SLOT")
                          where table1.Field<string>("SLOT") != table2.Field<string>("SLOT")
                          select table1;

testing 在代码运行后最终为 null。但如果我要执行以下操作。

var testingtable1 = from table1 in oData.AsEnumerable()
                                select table1;

            var testingtable2 = from table2 in oDataiSeries.AsEnumerable()
                                select table2;

testingtable1testingtable2 将被填充。

是因为我要比较字符串吗?

testingtable1testingtable2中,“SLOT”列是String

部分问题: 我正在使用 VS 2015,在调试时(将鼠标悬停在应该包含结果的 DataTable 对象上),表格没有显示正确的结果。它显示了 oData 的值,而不是 oData 和 oDataiSeries 之间的比较。我不确定我是否只是误解了 VS2015 如何显示 var 表,或者这是否是一个错误。如果我将结果 DataTable 绑定到 gridview 对象,与调试器相比,它将显示不同的行。我最终使用了@D Stanley 解决方案,并进行了一些修改。

【问题讨论】:

  • 您是否要进行“左连接”? (在第一个表中,但不是第二个),您想要“完全加入”吗? (两个表中的所有内容都将不匹配的值显示为 null)或 INNER JOIN(仅匹配的值)
  • Left join using LINQ的可能重复

标签: c# linq visual-studio-2015


【解决方案1】:

我想找出table1中存在哪些行,table2中不存在。

您不需要加入。只需在第二个表中查找不匹配的记录:

var orphans = oData.AsEnumerable()
                   .Where(d => !oDataiSeries.AsEnumerable()
                                            .Any(s => s.Field<string>("SLOT").Trim() == d.Field<string>("SLOT").Trim()));

或者如果您想先提取值以提高性能,请尝试

var series = oDataiSeries.AsEmumerable()
                         .Select(s => s.Field<string>("SLOT"));
var orphans = oData.AsEmumerable()
                   .Where(d => !oDataiSeries.Contains(d.Field<string>("SLOT"));

是因为我要比较字符串吗?

不,这是因为join 默认情况下是一个内连接,所以所有记录在两个数据集之间都会有匹配的值。

【讨论】:

  • 您的第一个示例只是使用 oData 中的所有行填充孤儿。我尝试将 == 更改为 !=,但由于某种原因它仍然是相同的结果......有什么想法吗?
  • @Kukoy 你有没有看到oDataSeries前面的!?比较也区分大小写。
  • @D Stanley,是的,我做到了。我刚刚也尝试了您的第二个示例,但我仍然得到相同的结果。
  • @Kukoy 没有你的数据很难说。如果您在调试器中运行它,series 是否有您期望的数据?您是否正在查看调试器中的结果? Linq 查询在调试器中表现不佳,除非您将它们转换为数组或列表。
  • @D Stanley,原来有两个问题。 1,我需要 .Trim() 因为空格弄乱了查询。 2、VS 2015在调试时似乎无法正确显示表格。我将在整个问题中添加解释。感谢您的帮助。
猜你喜欢
  • 2018-11-14
  • 2010-09-12
  • 2020-05-26
  • 2017-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
相关资源
最近更新 更多