繁体   English   中英

EF Core 2.0 Group由其他属性

EF Core 2.0 Group By other properties

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有2张桌子:

USERS
UserId
Name
Scores (collection of table Scores)

SCORES
UserId
CategoryId
Points

我需要显示所有用户和他们的点的总和,但我还需要显示用户的名称。 它可以通过CategoryId过滤或不过滤。

Context.Scores
.Where(p => p.CategoryId == categoryId) * OPTIONAL
.GroupBy(p => p.UserId)
.Select(p => new 
{
    UserId = p.Key,
    Points = p.Sum(s => s.Points),
    Name = p.Select(s => s.User.Name).FirstOrDefault()
}).OrderBy(p => p.Points).ToList();

问题是,当我添加

Name = p.Select(s => s.User.Name).FirstOrDefault()

这需要很长时间。 我不知道如何访问不在GroupBy内部或是SUM的属性。 这个例子非常简单,因为我没有Name,还有User表中的其他属性。

我怎么解决这个问题?

1 个回复

这需要很长时间,因为查询导致客户端评估 请参阅客户评估性能问题以及如何使用客户端评估日志记录来识别相关问题。

如果您真的使用EF Core 2.0,那么除了升级到包含改进的LINQ GroupBy转换的 v2.1之外,您无能为力。 即使使用它,解决方案也不是直截了当 - 查询仍然使用客户端评估。 但是可以通过将GroupBy部分分成子查询并将其连接到Users表来获取所需的附加信息来重写它。

像这样的东西:

var scores = db.Scores.AsQueryable();
// Optional
// scores = scores.Where(p => p.CategoryId == categoryId);

var points = scores
     .GroupBy(s => s.UserId)
     .Select(g => new
     {
         UserId = g.Key,
         Points = g.Sum(s => s.Points),
     });

var result = db.Users
    .Join(points, u => u.UserId, p => p.UserId, (u, p) => new
    {
        u.UserId,
        u.Name,
        p.Points
    })
    .OrderBy(p => p.Points)
    .ToList();

这仍然会产生警告

LINQ表达式'orderby [p] .Points asc'无法翻译,将在本地进行评估。

但至少查询被翻译并作为单个SQL执行:

SELECT [t].[UserId], [t].[Points], [u].[UserId] AS [UserId0], [u].[Name]
FROM [Users] AS [u]
INNER JOIN (
    SELECT [s].[UserId], SUM([s].[Points]) AS [Points]
    FROM [Scores] AS [s]
    GROUP BY [s].[UserId]
) AS [t] ON [u].[UserId] = [t].[UserId]
3 包括不适用于ef-core2.0

在VS2017中处理aspnetcore2.0项目 '.Include(o => o.OrderEventLogs)'子句在以下查询中不起作用: 未加载相关的OrderEventLog实体。 (实际上有时它可以工作,有时却不能。相同的查询,相同的参数) 这真的很奇怪, ...

6 阻止更新EF-core中的导航属性

请创建新的主要实体时,如何防止EF.core尝试插入/更新外键表? 抛出此异常: 我的代码如下: 任何尝试创建一个新的Offence给了错误,EF.core试图为与导航相关的属性运行刀片: 我们如何防止这种情况? 编辑:创建和更新代码 ...

8 如何在多对多实体关系中扩展由EF-Core-5生成的联接表中的属性

我刚刚用ASP,Net Core 5和EF Core 5创建了一个应用程序。它需要两个实体-Bill和User之间的多对多关系。 因此,用户可以有许多账单,并且账单可以适用于许多用户。 使用EF Core 5,我了解到我应该能够忽略UserBill的联接表,该表包含两个实体的ID以及每个其他实体 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM