在实体框架 C# 中使用 Lambda 编写多个 Sum() SQL 查询

Posted

技术标签:

【中文标题】在实体框架 C# 中使用 Lambda 编写多个 Sum() SQL 查询【英文标题】:Write multiple Sum() SQL query using Lambda in Entity Framework C# 【发布时间】:2021-10-28 09:22:33 【问题描述】:

下面是我希望转换为 Lambda 的 SQL 查询

SELECT
    SUM("Rating" * "Rating") / SUM("Rating")
FROM 
    public."CustomerRating" 
WHERE 
    "DriverId" = '232'

这是我的 C# 代码:

public double GetDriverAvgRating(string id)

    var driver = _context.CustomerRating
                         .AsQueryable()
                         .Where(d => d.DriverId == id);

    var avgDriverRating = // i need to perform that query here

    return avgDriverRating;

【问题讨论】:

你有什么困难,这似乎是一个相当简单的练习。到目前为止你有任何代码吗?我必须说,这段代码的作者似乎忘记了如何计算一个数字 您是否设置了数据库上下文?另外,你真的需要一个开关盒吗? SELECT SUM(["Rating"]*["Rating"]) / SUM(["Rating"]) FROM public."CustomerRating" 似乎是您想要的。 谢谢约翰。我已经更新了上面的 C# 代码 你的 sql 没有 WHERE。你的 c# 有一个 Where。应该是哪个? 评分总是介于 1 和 5 之间的整数吗? 【参考方案1】:

我相信 EF 将能够正确地将其翻译为一个分组,例如

var driver = _context.CustomerRating
  .Where(cr => cr.DriverId == id)
  .GroupBy(cr => cr.DriverId, cr => cr.Rating)
  .Select(g => g.Select(r => r * r).Sum() /  g.Sum())
  .First();

它可能在查询中有一些额外的绒毛(例如一个只产生一个组的分组),但我不认为它会对查询的整体性能/规划产生任何重大影响

【讨论】:

以上是关于在实体框架 C# 中使用 Lambda 编写多个 Sum() SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

实体框架在运行时创建多个表 C#

C# LLSQL快速查询框架

IAuthenticationFilter 中的 C# Ninject Web API 异步查询导致实体框架中的多个操作错误

C# 实体框架每个 HttpContext 仅使用一个 ObjectContext

C# 实体框架 DBContext

C# lambda 加入和更新