gpt4 book ai didi

c# - TakeWhile 因不明原因失败

转载 作者:行者123 更新时间:2023-12-04 09:46:19 25 4
gpt4 key购买 nike

在我针对 SQL Server 2012 实例运行的以下 Linq 查询中,我尝试读取最新记录,直到之前建立的 MasterId标记(这是一个 Guid )。

var cdc = crm.CdcContacts
.Include("CdcMaster")
.OrderByDescending(x => x.CreatedOn)
.TakeWhile(x => x.MasterId != marker)
.OrderBy(x => x.CreatedOn);

然而,这失败了。

"Processing of the LINQ expression 'DbSet\r\n
.OrderByDescending(x => x.CreatedOn)\r\n .TakeWhile(x => x.Id != new Guid(\"ABFF5734-F59F-EA11-80CB-005056BC5333\"))' by 'NavigationExpandingExpressionVisitor' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information."



错误消息中的链接指向客户端与服务器评估页面,所以我很确定 TakeWhile无法评估 - 我知道游标逻辑在旧版本的 SQL Server 中的工作方式不同,也许这可能是一种解释。

当我更换 TakeWhile用一个简单的 Take(10) ,一切正常 - 这整齐地评估为 SELECT TOP 10 *但是在异常发生之前,我没有通过控制台记录器工厂获得生成的 SQL 的输出。

有人可以帮助我了解可能存在的原因 TakeWhile不工作?

最佳答案

此异常表示不受支持的 LINQ 方法。

我希望 EF Core 提供包含支持/不支持的 LINQ 方法(和 CLR 属性/方法)列表的文档,例如 EF6,但到目前为止他们还没有,所以这是反复试验。

但是TakeWhileSkipWhile绝对是不受支持的人之一(我猜他们永远不会)。我不知道为什么 Queryable完全包含它们 - 可能是为了与 Enumerable 兼容方法。但是 AFAIK 没有查询提供程序(当然 LINQ to Object 除外)确实实现了它们,因为它们没有自然的 SQL 转换。

你当然可以切换到 Enumerable方法(使用 AsEnumerable(),如链接中所述),但一般来说这并不好。您最好使用其他标准 LINQ 运算符来表达您的查询。

附言数据库和 EF Core 数据库提供程序无关紧要 - EF Core LINQ 查询处理器不支持上述方法。

关于c# - TakeWhile 因不明原因失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62087259/

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