我试图做一个查询是这样的...
query.Where(x => !string.IsNullOrEmpty(x.PropertyName));
但它失败...
所以现在我已经实现以下,其中工程...
query.Where(x => (x.PropertyName ?? string.Empty) != string.Empty);
有没有更好的(更原生?)的方式,LINQ处理呢?
编辑
道歉! 不包括供应商...这是使用LINQ to SQL
我试图做一个查询是这样的...
query.Where(x => !string.IsNullOrEmpty(x.PropertyName));
但它失败...
所以现在我已经实现以下,其中工程...
query.Where(x => (x.PropertyName ?? string.Empty) != string.Empty);
有没有更好的(更原生?)的方式,LINQ处理呢?
编辑
道歉! 不包括供应商...这是使用LINQ to SQL
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=367077
问题陈述
它可以编写的LINQ to SQL是获取具有null或在某一领域的空字符串的所有行,但它不可能使用string.IsNullOrEmpty做到这一点,尽管许多其他字符串方法映射到LINQ到SQL。 建议的解决方案允许string.IsNullOrEmpty中的LINQ to SQL WHERE子句使这两个查询具有相同的结果:
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的帖子
这不会失败的Linq2Objects,但它会失败LINQ2SQL,所以我假设你正在谈论的SQL提供商或类似的东西。
其中的原因与SQL提供处理您的lambda表达式的方式做。 它并不需要其作为函数Func<P,T>
但表达Expression<Func<P,T>>
。 它需要的是表达式树并将其转换这样一个实际的SQL语句,它发送关闭服务器。
译者知道如何处理基本的运营商,但它不知道如何处理的对象的方法。 它不知道IsNullOrEmpty(x)
转换为return x == null || x == string.empty
return x == null || x == string.empty
。 这已被用于转换为SQL发生明确完成。
这将很好地工作LINQ到对象。 然而,一些LINQ提供程序很难运行CLR方法作为查询的一部分。 这是一些数据库提供商expecially如此。
问题是,DB提供试运行和编译LINQ查询作为数据库查询,以防止跨线牵引用的所有对象。 这是一件好事,但偶尔会限制你的谓词的灵活性。
不幸的是,没有检查供应商的文件,很难总是知道什么会或不会直接在供应商的支持。 它看起来像你的供应商允许的比较,而不是字符串检查。 我猜,你的情况,这可能是一样好办法的,你可以得到。 (这真的不是从IsNullOrEmpty检查比创造比较“的String.Empty”实例不同,其他的,但这是次要的。)