实体框架 - 如何在缩写的EF linq中实现此SQL

Gre*_*reg 3 .net c# linq-to-entities entity-framework entity-framework-4

任何人都可以帮助解决C#代码以缩写形式将此SQL实现为Entity Framework Linq的问题吗?(例如,你有"."符号,如xxx.where(......等)

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
Run Code Online (Sandbox Code Playgroud)

Mor*_*avi 5

基于方法的查询:
要在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) });
Run Code Online (Sandbox Code Playgroud)


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

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) };
Run Code Online (Sandbox Code Playgroud)


检查生成的SQL:
要验证这些查询在运行时为您提供所需的Sql命令,您可以执行以下操作:

string sqlCommand = ((ObjectQuery)query).ToTraceString();
Run Code Online (Sandbox Code Playgroud)


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

基于方法的查询语法示例:连接运算符
查询表达式语法示例:连接运算符

  • SQL`betweens`是包含的,因此您的日期时间范围检查需要更正匹配. (2认同)