【问题标题】:entity framework - how can I implement this SQL in the abbreviated EF linq实体框架 - 如何在缩写的 EF linq 中实现此 SQL
【发布时间】:2010-10-08 01:57:06
【问题描述】:

任何人都可以提供 C# 代码以将这个 SQL 实现为缩写形式的 Entity Framework Linq 吗? (例如,您有“。”符号的地方,例如 xxx.where(... etc)

SELECT PN.Name, Sum(U.Amount)
FROM Usages as U, ProcessNames as PN
WHERE PN.Id == U.ProcessNameId 
   AND U.Datetime BETWEEN '2010-01-08' AND '2010-10-11'
Group By PN.Name

【问题讨论】:

    标签: c# .net entity-framework linq-to-entities entity-framework-4


    【解决方案1】:

    基于方法的查询:
    要在 lambda 中实现这一点,我们需要利用 Queryable.GroupJoin

    var query = context.ProcessNames
        .GroupJoin(context.Usages
                          .Where(u => u.Datetime >= new DateTime(2010, 1, 8) ) 
                                      && u.Datetime <= new DateTime(2010, 10, 11),
                   pn  => pn.Id,
                   u => u.ProcessNameId, 
                   (pn, usages) => new { Name = pn.Name, 
                                         Sum = usages.Sum(u => u.Amount) });
    


    查询表达式:
    查询表达式语法中的查询完全相同:

    var query = 
        from pn in context.ProcessNames
        join u in context.Usages
                         .Where(u => u.Datetime >= new DateTime(2010, 1, 8) ) 
                                     && u.Datetime <= new DateTime(2010, 10, 11),
        on pn.Id 
        equals u.ProcessNameId 
        into g                      
        select new { Name = pn.Name, 
                     Sum = g.Sum(u => u.Amount) };
    


    检查生成的 SQL:
    要验证这些查询是否在运行时为您提供了所需的 Sql 命令,您可以这样做:

    string sqlCommand = ((ObjectQuery)query).ToTraceString();
    


    更多示例:
    有关 GroupJoin 的一些好的示例,请查看以下内容:

    Method-Based Query Syntax Examples: Join Operators
    Query Expression Syntax Examples: Join Operators

    【讨论】:

    • SQL betweens 包含在内,因此您的日期时间范围检查需要更正以匹配。
    • 非常感谢 - 在我们的好奇心中,您认为哪种方法更容易理解程序?基于方法还是基于查询?
    • 不客气。我个人更喜欢 Method-Based 语法,虽然 Query Expression 语法更具可读性,当然也更容易编写,但它是另一个抽象层次,我认为如果我们熟悉 Method Based 语法,我们总是可以把它变成查询表达式,但这只是我的意见。
    【解决方案2】:

    试试这个(我没有你的代码,所以我没有得到编译器帮助):

    from u in context.Usages
    join pn in context.ProcessNames on pn.Id equals u.ProcessNameId
    where u.Datetime >= new DateTime(2010, 1, 8) && u.Datetime <= new DateTime(2010, 10, 11)
    group pn by pn.Name into g
    select new { Name = pn.Name , sum = g.Sum(u => u.Amount) };
    

    这是它的查询表达式版本。要获得基于 lambda 的语法(我相信您会问这个问题),请将查询放入 LinqPad 并运行它。然后单击 LinqPad 中的 lambda 选项卡,它会向您显示上述查询的语法,就像您使用 lambda 表达式(即,您有“.”符号的地方)而不是查询表达式编写的一样。

    【讨论】:

    • SQL betweens 包含在内,因此您的日期时间范围检查需要更正以匹配。
    • @Will - 修复了内含物。
    猜你喜欢
    • 1970-01-01
    • 2017-07-07
    • 2016-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-05
    • 1970-01-01
    • 2010-09-05
    相关资源
    最近更新 更多