执行 Linq 组加入是不是有更好的解决方案?

Posted

技术标签:

【中文标题】执行 Linq 组加入是不是有更好的解决方案?【英文标题】:Is there a better solution for performing Linq group join?执行 Linq 组加入是否有更好的解决方案? 【发布时间】:2013-11-26 20:52:48 【问题描述】:

我有两个非常大的表,其中都有超过 10K 的重新编码。我需要使用 Linq 从这两个表中查询。看下面的例子,你可以看到我需要使用组加入。

以下是我的查询,它有效。但大约需要6-7分钟才能完成。 TableA 有超过 10K 条记录。表 B 的记录多于表 A。

from a in tableA
join b in tableB on new ID = a.OrderID, Name = a.Option 
             equals newID = b.OrderID, Name = b.SelectedOption into jgroup
select new
    OrderID = a.OrderID,
    SelectedOption = a.Option,
    SelectedOptionValue = 
             jgroup.Select(g => g.SelectedOptionValue).SingleOrDefault()

有没有更好的解决方案可以使用 linq to SQL 加快速度。

任何建议将不胜感激。谢谢!

【问题讨论】:

如果将 SelectedOptionValue 选择更改为 jgroup.FirstOrDefault().SelectedOptionValue 会有什么不同吗? 表 B 上有合适的索引吗? 嗨@It'sNotALie,谢谢。但这并没有什么不同。 问题很可能不在于 LINQ 查询本身。您应该在 Sql Server 中尝试相同的查询并在此处发布执行计划,以便我们查看并建议索引改进 这个 linq 是对象还是查询提供程序?如果是后者,查询提供者是什么? 【参考方案1】:

linq 语句可能没有以最佳方式翻译。我认为更明确的左连接语法效果最好

var query = 
  from a in tableA
  from b in tableB.Where(x => a.OrderID == x.OrderID && a.Option == x.SelectedOption).DefaultIfEmpty()
  select new
  
    OrderID = a.OrderID,
    SelectedOption = a.Option,
    SelectedOptionValue = b.SelectedOptionValue
  ;

【讨论】:

这不是左连接,它是交叉连接,在更大的数据集上表现会差很多(除了根本不返回相同的结果)。 @Servy - 这被翻译为 Linq-to-Sql 中的左连接。看看这个问题:***.com/questions/700523/linq-to-sql-left-outer-join 如果第二个表中有多个匹配条目与第一个表中的给定项目匹配,则您的代码有两个输出行,OP 的代码将有一个。他们显然没有产生相同类型的连接。 @Servy - OP 使用SingleOrDefault。如果有机会进行多次匹配,OP 将使用FirstOrDefault 我不希望查询提供程序对这两种方法有不同的 SQL 表示;我希望它能以同样的方式对待它们。

以上是关于执行 Linq 组加入是不是有更好的解决方案?的主要内容,如果未能解决你的问题,请参考以下文章

linq lambda多组加入

对于不支持子查询的 NHibernate-to-LINQ 是不是有任何解决方法?

如果更好的设备通过 wifi direct 加入网络,组所有者会改变吗?

如何用 LINQ 重写笛卡尔积

磁盘占用100%怎么解决

计算机无法加入域的终级解决方法