这两个查询之间有什么区别,其中一个会抛出 System.NotSupportedException

本文关键字:一个 System NotSupportedException 区别 查询 两个 之间 什么 | 更新日期: 2023-09-27 18:32:46

我遇到了一个在这个网站上搜索得很好的异常:

System.NotSupportedExceptionLocal 序列不能在查询运算符的 LINQ to SQL 实现中使用,但 Include 运算符除外。

我发现这个答案很有帮助。 但是,似乎与答案相矛盾,此查询对我来说效果很好:

return clients.Where(client => 
    client.CompanyID.HasValue && 
    client.Company.CompanyAssociations.Any(ass => 
       localListOfSearchStrings.Any(str => ass.Contact.FullName.Contains(str))));

而这个查询,在我看来看起来完全相同,抛出异常:

return stores.Where(store => 
    store.Asset.AssetOwners.Any(assetOwner => 
        assetOwner.Client.CompanyID.HasValue && 
        assetOwner.Client.Company.CompanyAssociations.Any(ass =>
            localListOfSearchStrings.Any(str => 
                ass.Contact.FullName.Contains(str)))));

我不想将记录列表拉入本地内存进行评估。

另一个复杂问题是localListOfSearchStrings可能包含一个或多个姓氏。

所以我真的需要评估

localListOfSearchStrings.Any(str => 
    CompanyAssociation.Contact.FullName.Contains(str))

而不是,例如,

listOfLocalSearchStrings.Contains(CompanyAssociation.Contact.FullName)

这两个查询之间有什么区别,其中一个会抛出 System.NotSupportedException

当然,答案很愚蠢。

上面引用的答案是正确的。 查询正常工作的原因是clients在调用查询之前实际上已强制转换为列表 - SQL Server 事件探查器提醒我这一事实。 这太可怕了。

正如Gert Arnold上面指出的那样,这个问题的解决方案是使用PredicateBuilder(在引用的问题中也提出了)。

相关文章: