【发布时间】:2019-09-26 06:09:38
【问题描述】:
我有一个查询来查看用户插入了多少实体 (Version = 1) 以及他们更新了多少实体 (Version > 1)。它通过记录的用户名查询整个表和组。这是原始 SQL 查询:
SELECT
[s.InternalUser].[UserName],
COUNT(CASE WHEN s.Version = 1 THEN 1 END) AS [InsertCount],
COUNT(CASE WHEN s.Version > 1 THEN 1 END) AS [UpdateCount]
FROM [Sale] AS [s]
INNER JOIN [InternalUser] AS [s.InternalUser] ON [s].[InternalUserId] =
[s.InternalUser].[InternalUserId]
GROUP BY [s.InternalUser].[UserName]
这将返回我想要的。我尝试在使用 EF Core 2.2 的项目中将此转换为 Linq 查询:
var countData = await _context.Sale
.GroupBy(s => s.InternalUser.UserName)
.Select(g => new
{
UserName = g.Key,
InsertCount = g.Count(s => s.Version == 1),
UpdateCount = g.Count(s => s.Version > 1)
})
.ToListAsync();
但是这会导致整个表被加载并且计算在内存中完成:
Microsoft.EntityFrameworkCore.Query:警告:无法翻译 LINQ 表达式“GroupBy([s.InternalUser].UserName, [s])”,将在本地进行评估。 Microsoft.EntityFrameworkCore.Query:警告:无法翻译 LINQ 表达式“where ([s].Version == 1)”,将在本地进行评估。 Microsoft.EntityFrameworkCore.Query:警告:无法翻译 LINQ 表达式“Count()”并将在本地进行评估。 Microsoft.EntityFrameworkCore.Query:警告:无法翻译 LINQ 表达式“where ([s].Version == 1)”,将在本地进行评估。 Microsoft.EntityFrameworkCore.Query:警告:无法翻译 LINQ 表达式“Count()”并将在本地进行评估。 Microsoft.EntityFrameworkCore.Query:警告:无法翻译 LINQ 表达式“where ([s].Version > 1)”,将在本地进行评估。 Microsoft.EntityFrameworkCore.Query:警告:无法翻译 LINQ 表达式“Count()”并将在本地进行评估。 Microsoft.EntityFrameworkCore.Query:警告:无法翻译 LINQ 表达式“where ([s].Version > 1)”,将在本地进行评估。 Microsoft.EntityFrameworkCore.Query:警告:无法翻译 LINQ 表达式“Count()”,将在本地计算。
如果我删除 Group By 被翻译为查询,则它是 Count() 查询导致的。
有没有一种不同的写法可以转化为我之前发布的 SQL 查询之类的东西?
【问题讨论】:
标签: c# linq entity-framework-core