字符串值不为null或空的LINQ语法

az31mfrm  于 2022-12-06  发布在  其他
关注(0)|答案(5)|浏览(310)

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

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

但它失败了。
所以现在我已经实现了以下内容,它起作用了...

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

LINQ是否有更好的(更本地化的)处理方式?

编辑

对不起!没有包括提供程序...这是使用LINQ to SQL

lvmkulzt

lvmkulzt1#

http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=367077

问题陈述

可以编写LINQ to SQL来获取给定字段中包含null或空字符串的所有行,但不可能使用string.IsNullOrEmpty来实现这一点,尽管许多其他字符串方法都Map到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.堆栈溢出后
eeq64g8w

eeq64g8w2#

这在Linq2Objects上不会失败,但在Linq2SQL上会失败,所以我假设您在谈论SQL提供程序或类似的东西。
原因与SQL提供程序处理lambda表达式的方式有关。它没有将其作为函数Func<P,T>,而是作为表达式Expression<Func<P,T>>。它将表达式树转换为实际的SQL语句,并将其发送到服务器。
翻译器知道如何处理基本的操作符,但不知道如何处理对象上的方法,也不知道IsNullOrEmpty(x)会被翻译成return x == null || x == string.empty,这必须显式地完成,才能翻译成SQL。

fhg3lkii

fhg3lkii3#

这将与Linq to Objects配合使用。但是,某些LINQ提供程序在将CLR方法作为查询的一部分运行时会遇到困难。对于某些数据库提供程序来说尤其如此。
问题是DB提供程序试图将LINQ查询作为数据库查询来移动和编译,以防止通过网络拉取所有对象。这是一件好事,但有时确实会限制 predicate 的灵活性。
不幸的是,如果不检查提供程序文档,很难总是确切地知道提供程序直接支持什么或不支持什么。看起来您的提供程序允许比较,但不允许字符串检查。我猜,在您的情况下,这可能是您所能得到的最好的方法。(它实际上与IsNullOrEmpty检查没有太大区别,只是创建了“string.Empty”示例用于比较,但这是次要的。)

a8jjtwal

a8jjtwal4#

如果你想将集合的类型从可空类型IEnumerable<T?>更改为非空类型IEnumerable<T>,你可以使用.OfType<T>()
.OfType<T>()将删除空值并返回T类型的列表。
示例:如果您有一个可为空的字符串列表:List<string?>您可以使用OfType<string()将清单类型变更为string,如下列范例所示:

List<string?> nullableStrings = new List<string?> { "test1", null, "test2" };

List<string> strings = nullableStrings.OfType<string>().ToList();
// strings now only contains { "test1", "test2" }

这将产生一个只包含test1test2的字符串列表。

ktca8awb

ktca8awb5#

... 12年前:)但仍然,有些人可能会发现它有帮助:
通常,检查白色也很好

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

它将转换为sql,如下所示:

WHERE [x].[PropertyName] IS NOT NULL AND ((LTRIM(RTRIM([x].[PropertyName])) <> N'') OR [x].[PropertyName] IS NULL)

或其他方式:

query.Where(x => string.Compare(x.PropertyName," ") > 0);

将转换为sql,如下所示:

WHERE [x].[PropertyName] > N' '

相关问题