【问题标题】:SQL to Linq conversion with cross join使用交叉连接的 SQL 到 Linq 转换
【发布时间】:2011-06-10 14:05:02
【问题描述】:

有人可以帮忙在c#中将以下sql转换为linq吗?

select s.SYSTEM_NAME,
       r.RESET_CODE,
       COUNT(v.reset_code) 
  from (select distinct system_name 
          from tbl) s 
cross join (select distinct reset_code 
              from tbl) r 
left join tbl v on v.SYSTEM_NAME = s.SYSTEM_NAME 
               and v.RESET_CODE=r.RESET_CODE 
 group by s.SYSTEM_NAME,r.RESET_CODE 

【问题讨论】:

    标签: sql linq join cross-join


    【解决方案1】:

    交叉连接通常表示为查询表达式中的多个 from 子句,或扩展方法语法中对 SelectMany 的调用。

    所以您查询的第一部分可能是:

    var query = from systemName in db.Table.Select(x => x.SystemName).Distinct()
                from resetCode in db.Table.Select(x => x.ResetCode).Distinct()
                ...
    

    左外连接通常用“join ... into ...”查询表示,可能像这样:

    var query = from systemName in db.Table.Select(x => x.SystemName).Distinct()
                from resetCode in db.Table.Select(x => x.ResetCode).Distinct()
                join tmp in db.Table on 
                    new { ResetCode = resetCode, SystemName = systemName } 
                    equals new { tmp.ResetCode, tmp.SystemName }
                    into tmpGroup
                select new { ResetCode = resetCode,
                             SystemName = systemName,
                             Count = tmpGroup.Count() };
    

    说实话,我不确定 Count 部分...我不能 100% 确定 COUNT(v.ResetCode) 在原始 SQL 中的作用。

    【讨论】:

    • 非常感谢。它解决了我的问题。我在 count() 中添加了列名,以使缺少的重置代码为 0。 linq 查询正确地向我显示了结果。但是 niot 有 group by 会产生影响吗?只是想知道它实际上扮演什么角色..
    • @Sasi:您正在通过“join ... into”操作有效地执行“group by”操作。它使用 GroupJoin LINQ 查询运算符。
    猜你喜欢
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 1970-01-01
    • 2014-03-08
    • 1970-01-01
    • 2017-01-26
    • 2013-04-12
    • 1970-01-01
    相关资源
    最近更新 更多