LINQ语法,其中,字符串值不为空或空(LINQ syntax where string value

2019-07-04 10:52发布

我试图做一个查询是这样的...

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

但它失败...

所以现在我已经实现以下,其中工程...

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

有没有更好的(更原生?)的方式,LINQ处理呢?

编辑

道歉! 不包括供应商...这是使用LINQ to SQL

Answer 1:

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的帖子



Answer 2:

这不会失败的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发生明确完成。



Answer 3:

这将很好地工作LINQ到对象。 然而,一些LINQ提供程序很难运行CLR方法作为查询的一部分。 这是一些数据库提供商expecially如此。

问题是,DB提供试运行和编译LINQ查询作为数据库查询,以防止跨线牵引用的所有对象。 这是一件好事,但偶尔会限制你的谓词的灵活性。

不幸的是,没有检查供应商的文件,很难总是知道什么会或不会直接在供应商的支持。 它看起来像你的供应商允许的比较,而不是字符串检查。 我猜,你的情况,这可能是一样好办法的,你可以得到。 (这真的不是从IsNullOrEmpty检查比创造比较“的String.Empty”实例不同,其他的,但这是次要的。)



文章来源: LINQ syntax where string value is not null or empty