【问题标题】:Sql Query to LinqSql 查询到 Linq
【发布时间】:2010-11-12 08:37:17
【问题描述】:

如何将此查询从 SQL 转换为 Linq:

SELECT status As 'Status',
       count(status) As 'Count'
FROM tbl_repair_order 
WHERE contract = 'con' and 
      (status = 'Parts Arr' or 
       status = 'NA' or 
       status = 'New Call' or 
       status = 'Parts Ord' or 
       status = 'Parts Req' or 
       status = 'F Work')
GROUP BY status

更新

谢谢各位,这是我使用的代码。测试返回和上面一样:

        List<string> statuses = new List<string> { "Parts Arr", "NA", "New Call", "Parts Ord", "Parts Req", "F Work"}; 

        var result = (from x in db.tbl_repair_orders
                     where x.CONTRACT == strContract
                        && statuses.Contains(x.STATUS)
                     group x.STATUS by x.STATUS into grouping
                     select new { Status = grouping.Key, Count = grouping.Count() });

        return result;

【问题讨论】:

  • 我认为您应该注意 Eamon 在他回答的第二个要点中的警告。
  • 实际上,.Contains() 调用确实正确转换为 LinqToSql(也可能转换为 EF)-blog.wekeroad.com/2008/02/27/…
  • 阅读该链接后,还值得注意的是,使用数组而不是 List 将生成 IN 语句。

标签: sql linq linq-to-sql


【解决方案1】:

至于将 SQL 语句转换为等效的 Linq 到 SQL 语句,您应该查看执行此操作的 Linqer 工具。我不认为这个应用程序适合用来重写你的整个应用程序,但它可以成为学习 Linq to SQL 的一个非常有用的工具。

【讨论】:

    【解决方案2】:
        string[] statuses = new string[] { "Parts Arr", "NA", "New Call", "Parts Ord", "Parts Req", "F Work" };
        var x = (from ro in db.tbl_repair_order
                 where ro.contract == "con"
                    && statuses.Contains(ro.status)
                 group 0 by ro.status into grouping
                 select new { Status = grouping.Key, Count = grouping.Count() });
    

    我不知道语法是否正确(尤其是最后两行),但应该很接近。

    根据 Eamon Nerbonne 在 cmets 中的修正,我在 group 和 by 之间添加了 0。另外,感谢 Ryan Versaw 提供的链接,该链接解释了用于生成 IN 子句的列表和数组。

    【讨论】:

    • 应该是grouping.Key——除此之外,我认为它看起来是正确的。
    • 我在我的版本中的主要区别(足够相似,我没有发布新答案)是使用列表。 List&lt;string&gt; statuses = new List&lt;string&gt; { "Parts Arr", "NA", "New Call", "Parts Ord", "Parts Req", "F Work"};然后把where条件改成这样:ro.contract = "con" &amp;&amp; statuses.Contains(ro.status)
    • @Ryan,感谢您的关键提示,我在发布后也注意到了。
    • @Ryan,您介意我编辑答案以包含您的替代方案吗?比起大量的 OR,我更喜欢它。
    • @Andy:语法是group &lt;expression to include in group&gt; by &lt;group key&gt; into &lt;groupName&gt;
    【解决方案3】:

    假设你正确地连接你的桌子,像

    var statusCounts =
        from row in youDbNameHere.tbl_repair_order
        where row.contract == "con"
            && (row.status == "Parts Arr"
            || row.status == "NA"
            || row.status == "New Call"
            || row.status == "Parts Ord"
            || row.status == "Parts Req"
            || row.status == "F Work")
        group 0 by row.status into g
        select new { Status = g.Key, StatusCount = g.Count() };
    

    ...我看到安迪打败了我 ;-)

    注意事项:

    • 您需要在“group”和“by”之间包含一个表达式,该表达式将被评估以形成组键下可访问的值集(在您的情况下它是不相关的,所以零很好)。
    • 如果您希望使用 Linq-to-Sql 或 Linq-to-Entities(或其他一些 IQueryable 实现),请注意您的代码不会直接在 C# 中执行,而是被翻译(应该如此)成sql - 因此避免使用无法翻译的 .NET 特定调用,因为这些通常会导致运行时异常或(很少)导致生成的查询在客户端进行部分评估(以潜在的高昂性能成本)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多