gpt4 book ai didi

entity-framework - 无法翻译 LINQ 表达式。以可翻译的形式重写查询

转载 作者:行者123 更新时间:2023-12-04 12:39:31 24 4
gpt4 key购买 nike

从 SQL 表中,我试图获取每个项目的最后一行。
我分配了一个用户列表(objectIds 列表)并希望获得他们每个人的最后一份工作。
这是下面的功能。

   public async Task<List<Job>> GetLastJobs(List<int> objectIds)
{
using ManagerContext context = new ManagerContext(_callContext);
List<Job> jobs = context.Jobs.Where(j => j.ObjectId.HasValue && objectIds.Contains(j.ObjectId.Value)).GroupBy(j => j.ObjectId).Select(j => j.OrderByDescending(p => p.Id).FirstOrDefault()).ToList();
return null;
}

在执行时,它返回:
the LINQ expression '(GroupByShaperExpression:
KeySelector: (j.ObjectId),
ElementSelector:(EntityShaperExpression:
EntityType: Job
ValueBufferExpression:
(ProjectionBindingExpression: EmptyProjectionMember)
IsNullable: False
)
)
.OrderByDescending(p => p.Id)' could not be translated.

要么以可翻译的形式重写查询,
或通过插入调用显式切换到客户评估
到 AsEnumerable(),
AsAsyncEnumerable(),
ToList(),
或 ToListAsync()。
https://go.microsoft.com/fwlink/?linkid=2101038
想要查询更多的信息。

我不知道如何,从哪里开始解决问题

最佳答案

基本问题是 SQL 没有像 LINQ 的 GroupBy 那样强大的分组运算符。 SQL GROUP BY 必须聚合所有非分组列,并且在大多数 RDBMS 中没有 FIRST() 聚合函数。因此,您必须使用 Windowing Functions 编写此查询,而 EF Core 尚未处理。

可以翻译编写此查询的另一种方法。

  var jobs = db.Jobs.Where(j => j.ObjectId.HasValue && objectIds.Contains(j.ObjectId.Value))
.Where(j => j.Id == db.Jobs.Where(j2 => j2.ObjectId == j.ObjectId).Max(j => j.Id))
.ToList();

翻译成
SELECT [j].[Id], [j].[ObjectId]
FROM [Jobs] AS [j]
WHERE ([j].[ObjectId] IS NOT NULL AND [j].[ObjectId] IN (1, 2, 3)) AND ([j].[Id] = (
SELECT MAX([j0].[Id])
FROM [Jobs] AS [j0]
WHERE [j0].[ObjectId] = [j].[ObjectId]))

关于entity-framework - 无法翻译 LINQ 表达式。以可翻译的形式重写查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60872863/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com