这两个查询之间有什么区别,其中一个引发System.NotSupportedException

时间:2013-09-25 06:56:35

标签: c# linq-to-sql

我遇到了一个在此网站上搜索得很好的例外情况:

  

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

我发现this回答有帮助。然而,看似与答案相矛盾的是,这个查询对我来说效果很好:

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)

1 个答案:

答案 0 :(得分:1)

当然,答案很愚蠢。

答案cited above是正确的。查询工作的原因是因为clients实际上是在调用查询之前将其转换为列表 - SQL Server Profiler提醒我这个事实。这太糟糕了。

正如Gert Arnold所说,问题的解决方案是使用PredicateBuilder(也在引用的问题中提出)。