TakeWhile 因不明原因而失败

TakeWhile fails for unapparent reason

在我下面的 Linq 查询中,我 运行 针对 SQL Server 2012 实例,我尝试读取最新的记录,直到先前建立的 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."

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

当我用一个简单的 Take(10) 替换 TakeWhile 时,一切正常 - 这很好地评估为 SELECT TOP 10 * 但我没有得到生成的 SQL 的输出异常命中前的控制台记录器工厂。

有人可以帮助我了解导致此 TakeWhile 不起作用的可能原因吗?

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

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

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

您当然可以切换到 Enumerable 方法(使用 AsEnumerable(),如 link 中所述),但这通常不太好。您最好使用其他标准 LINQ 运算符来表达您的查询。


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