可以编写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;
这在Linq2Objects上不会失败,但在Linq2SQL上会失败,所以我假设您在谈论SQL提供程序或类似的东西。 原因与SQL提供程序处理lambda表达式的方式有关。它没有将其作为函数Func<P,T>,而是作为表达式Expression<Func<P,T>>。它将表达式树转换为实际的SQL语句,并将其发送到服务器。 翻译器知道如何处理基本的操作符,但不知道如何处理对象上的方法,也不知道IsNullOrEmpty(x)会被翻译成return x == null || x == string.empty,这必须显式地完成,才能翻译成SQL。
5条答案
按热度按时间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,以便这两个查询具有相同的结果:
其他阅读:
3.堆栈溢出后
eeq64g8w2#
这在Linq2Objects上不会失败,但在Linq2SQL上会失败,所以我假设您在谈论SQL提供程序或类似的东西。
原因与SQL提供程序处理lambda表达式的方式有关。它没有将其作为函数
Func<P,T>
,而是作为表达式Expression<Func<P,T>>
。它将表达式树转换为实际的SQL语句,并将其发送到服务器。翻译器知道如何处理基本的操作符,但不知道如何处理对象上的方法,也不知道
IsNullOrEmpty(x)
会被翻译成return x == null || x == string.empty
,这必须显式地完成,才能翻译成SQL。fhg3lkii3#
这将与Linq to Objects配合使用。但是,某些LINQ提供程序在将CLR方法作为查询的一部分运行时会遇到困难。对于某些数据库提供程序来说尤其如此。
问题是DB提供程序试图将LINQ查询作为数据库查询来移动和编译,以防止通过网络拉取所有对象。这是一件好事,但有时确实会限制 predicate 的灵活性。
不幸的是,如果不检查提供程序文档,很难总是确切地知道提供程序直接支持什么或不支持什么。看起来您的提供程序允许比较,但不允许字符串检查。我猜,在您的情况下,这可能是您所能得到的最好的方法。(它实际上与IsNullOrEmpty检查没有太大区别,只是创建了“string.Empty”示例用于比较,但这是次要的。)
a8jjtwal4#
如果你想将集合的类型从可空类型
IEnumerable<T?>
更改为非空类型IEnumerable<T>
,你可以使用.OfType<T>()
。.OfType<T>()
将删除空值并返回T
类型的列表。示例:如果您有一个可为空的字符串列表:
List<string?>
您可以使用OfType<string()
将清单类型变更为string
,如下列范例所示:这将产生一个只包含
test1
和test2
的字符串列表。ktca8awb5#
... 12年前:)但仍然,有些人可能会发现它有帮助:
通常,检查白色也很好
它将转换为sql,如下所示:
或其他方式:
将转换为sql,如下所示: