【问题标题】:LINQ join with filter criteria带有过滤条件的 LINQ 连接
【发布时间】:2010-01-19 23:36:52
【问题描述】:

这样的事情是如何在 linq 中完成的?它对 JOIN 有过滤条件。

这取自这个问题:SQL Filter criteria in join criteria or where clause which is more efficient

select salesman.salesmanid, max(sales.quantity)
from salesman
inner join sales  on salesman.salesmanid =sales.salesmanid 
              and sales.salesdate < salesman.promotiondate
group by salesman.salesmanid

谢谢

【问题讨论】:

    标签: .net linq linq-to-sql join criteria


    【解决方案1】:

    你不能在equals 以外的任何地方使用join,但这可能不是你想要的。我认为 SQL 查询写得很笨拙,日期比较应该在 WHERE 子句中,但我认为这是主观的。无论如何,这是在 Linq 中实现它的唯一方法:

    var results =
        from sm in salesman
        join s in sales on sm.salesmanid equals s.salesmanid
        where s.salesdate < sm.promotiondate
        group s by s.salesmanid into g
        select new { salesmanid = g.Key, maxsales = g.Max(s => s.quantity) };
    

    注意 - 更正了组行中的错字

    【讨论】:

    • 我刚刚在某处读到,您可以在连接之后直接使用 where 子句以提高性能(过滤),然后在 where 子句之后继续连接其他表。所以我现在要尝试一下。我正在尝试将此方法应用于现有数据库,我遇到了一个带有连接过滤的 sql 查询。它有大约 200 万条记录,其中包含我要加入的表。做一个直接的 where 子句而不是使用过滤连接会非常严重地影响性能。感谢您的回答,我现在要尝试一下。我会告诉你进展如何。
    • @Mike - 嗯,条件是JOIN 还是WHERE 的一部分并不重要,对数据库服务器来说真正重要的是正确的列被索引。我更喜欢将所有连接条件都写在实际的连接子句中,但这只是因为它更容易正确执行。
    • 它似乎没有任何区别。如你所说。再次感谢。
    【解决方案2】:

    假设您的表之间有导航属性,您可以将连接留给实体框架。

    var results = from s in salesmen
                  group s by s.salesmanid
                  select new
                  {
                      s.salesmanid,
                      maxsales = s.sales
                          .where(x => s.salesdate < x.promotiondate)
                          .max(x => x.quantity)
                  };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-03
      • 2013-01-19
      • 2019-12-15
      相关资源
      最近更新 更多