LINQ语法,其中字符串值不为null或为空

时间:2009-09-02 16:59:29

标签: linq linq-to-sql

我正在尝试这样的查询...

query.Where(x => !string.IsNullOrEmpty(x.PropertyName));

但它失败了......

所以现在我已经实现了以下功能......

query.Where(x => (x.PropertyName ?? string.Empty) != string.Empty);

有没有更好的(更本地的?)方式LINQ处理这个?

修改

道歉!没有包括提供者......这是使用LINQ to SQL

3 个答案:

答案 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检查没有什么不同,但这很小。)