TakeWhile由于不明原因而失败

时间:2020-05-29 13:36:20

标签: c# linq .net-core ef-core-3.1

在接下来的针对SQL Server 2012实例的Linq查询中,我尝试读取最新记录,直到以前建立的MasterId标记(即Guid)为止。 / p>

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

但是,这失败了。

“处理LINQ表达式'DbSet \ r \ n
.OrderByDescending(x => x.CreatedOn)\ r \ n .TakeWhile(x => x.Id!= 新的Guid(\“ ABFF5734-F59F-EA11-80CB-005056BC5333 \”))'由 “ NavigationExpandingExpressionVisitor”失败。这可能表明 EF Core中的错误或限制。看到 https://go.microsoft.com/fwlink/?linkid=2101433以获得更详细的信息 信息。”

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

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

有人可以帮助我了解此TakeWhile无法正常工作的可能原因吗?

1 个答案:

答案 0 :(得分:2)

此异常表明不支持LINQ方法。

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

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

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


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