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)列表的文档,但到目前为止他们还没有,所以这是反复试验。
但是 TakeWhile
和 SkipWhile
绝对是不受支持的一种(我猜他们永远不会)。我不确定为什么 Queryable
包含它们 - 可能是为了与 Enumerable
方法兼容。但是 AFAIK 没有查询提供程序(当然 LINQ to Object 除外)确实实现了它们,因为它们没有自然转换为 SQL.
您当然可以切换到 Enumerable
方法(使用 AsEnumerable()
,如 link 中所述),但这通常不太好。您最好使用其他标准 LINQ 运算符来表达您的查询。
P.S。数据库和 EF Core 数据库提供程序无关紧要 - EF Core LINQ 查询处理器不支持上述方法。
在我下面的 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)列表的文档,但到目前为止他们还没有,所以这是反复试验。
但是 TakeWhile
和 SkipWhile
绝对是不受支持的一种(我猜他们永远不会)。我不确定为什么 Queryable
包含它们 - 可能是为了与 Enumerable
方法兼容。但是 AFAIK 没有查询提供程序(当然 LINQ to Object 除外)确实实现了它们,因为它们没有自然转换为 SQL.
您当然可以切换到 Enumerable
方法(使用 AsEnumerable()
,如 link 中所述),但这通常不太好。您最好使用其他标准 LINQ 运算符来表达您的查询。
P.S。数据库和 EF Core 数据库提供程序无关紧要 - EF Core LINQ 查询处理器不支持上述方法。