gpt4 book ai didi

c# - 将 SQL 语句重写为 LINQ 查询导致运行时错误

转载 作者:行者123 更新时间:2023-12-02 16:13:14 24 4
gpt4 key购买 nike

作为 this question of mine 的后续行动我有这个 SQL:

SELECT Documents.* 
FROM Documents
WHERE Documents.ID IN
(
SELECT Keywords.DocumentID
FROM Keywords
WHERE
Keywords.Keyword = 'KeywordA' OR
Keywords.Keyword = 'KeywordB'
GROUP BY Keywords.DocumentID
HAVING COUNT(Keywords.Keyword) = 2
)

我确实使用了 Linqer将查询转换为 C# 以与 Entity Framework Core 5 一起使用:

from Document in db.Document
where
(from Keyword in db.Keyword
where
Keyword.Value == "KeywordA" ||
Keyword.Value == "KeywordB"
group Keyword by new {
Keyword.DocumentId
} into g
where g.Count(p => p.Value != null) == 2
select new {
g.Key.DocumentId
}).Contains(new { DocumentId = Document.DocumentId })
select Document

编译成功,但在运行查询时,出现错误:

The LINQ expression '<see below>' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

上述错误消息中格式化的 LINQ 表达式如下:

DbSet<Keyword>()
.Where(k => k.Value == "KeywordA" || k.Value == "KeywordB")
.GroupBy(
keySelector: k => new { DocumentId = k.DocumentId },
elementSelector: k => k)
.Where(e => e
.Count(p => p.Value != null) == 2)
.Select(e => new { DocumentId = e.Key.DocumentId })
.Any(p => p == new { DocumentId = EntityShaperExpression:
EntityType: Document
ValueBufferExpression:
ProjectionBindingExpression: EmptyProjectionMember
IsNullable: False
.DocumentId })

我真的不明白这里有什么问题。我只能想象 Linqer 太老了,无法生成在 EF Core 5 中使用的有效 C# 代码。

我的问题

有人可以提示我这里做错了什么以及如何解决这个问题吗? (即如何重写 C# 查询)

最佳答案

EF Core 查询转换仍然不支持许多 LINQ 结构,所有这些都没有明确支持/不支持的文档,这确实让我们走上了试错的道路,因此外部工具无法生成也就不足为奇了一个“正确的”翻译。

在这种特殊情况下,问题是 Contains 使用复杂参数调用(事件,尽管它是一个具有单个成员的类)。因为它们只支持带有原始参数的Contains

因此,使这项工作所需的最小更改是替换

select new
{
g.Key.DocumentId
}).Contains(new { DocumentId = Document.DocumentId })

select g.Key.DocumentId).Contains(Document.DocumentId)

关于c# - 将 SQL 语句重写为 LINQ 查询导致运行时错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67469423/

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