我正在尝试这样的查询...
query.Where(x => !string.IsNullOrEmpty(x.PropertyName));
但它失败了......
所以现在我已经实现了以下功能......
query.Where(x => (x.PropertyName ?? string.Empty) != string.Empty);
有没有更好的(更本地的?)方式LINQ处理这个?
修改
道歉!没有包括提供者......这是使用LINQ to SQL
答案 0 :(得分:42)
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=367077
问题陈述
可以编写LINQ to SQL来获取在给定字段中具有null或空字符串的所有行,但是不可能使用string.IsNullOrEmpty来执行此操作,即使许多其他字符串方法映射到LINQ to SQL。
提出的解决方案
在LINQ to SQL where子句中允许string.IsNullOrEmpty,以便这两个查询具有相同的结果:
var fieldNullOrEmpty =
from item in db.SomeTable
where item.SomeField == null || item.SomeField.Equals(string.Empty)
select item;
var fieldNullOrEmpty2 =
from item in db.SomeTable
where string.IsNullOrEmpty(item.SomeField)
select item;
其他阅读:
1. DevArt
2. Dervalp.com
3. StackOverflow Post
答案 1 :(得分:15)
Linq2bjects上的这个不会失败,但Linq2SQL会失败,所以我假设你在谈论SQL提供者或类似的东西。
原因与SQL提供程序处理lambda表达式的方式有关。它不是一个函数Func<P,T>
,而是一个表达式Expression<Func<P,T>>
。它接受表达式树并将其转换为实际的SQL语句,并将其发送到服务器。
翻译器知道如何处理基本操作符,但它不知道如何处理对象上的方法。它不知道IsNullOrEmpty(x)
会转换为return x == null || x == string.empty
。必须明确地完成对SQL的转换。
答案 2 :(得分:2)
这对于Linq to Objects可以正常工作。但是,某些LINQ提供程序难以在查询中运行CLR方法。某些数据库提供商尤其如此。
问题是数据库提供程序尝试将LINQ查询作为数据库查询移动并编译,以防止通过网络拉动所有对象。这是一件好事,但偶尔会限制谓词的灵活性。
遗憾的是,如果不检查提供程序文档,很难始终确切地知道提供程序中将直接支持哪些内容。看起来你的提供者允许比较,但不是字符串检查。我猜这个,在你的情况下,这可能与你能得到的方法一样好。 (除了创建用于比较的“string.Empty”实例之外,它与IsNullOrEmpty检查没有什么不同,但这很小。)