Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
字符串值不为null或空的LINQ语法_Linq_Linq To Sql - Fatal编程技术网

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

字符串值不为null或空的LINQ语法,linq,linq-to-sql,Linq,Linq To Sql,我想做一个这样的查询 query.Where(x => !string.IsNullOrEmpty(x.PropertyName)); 但它失败了 所以现在我已经实现了以下功能,可以正常工作 query.Where(x => (x.PropertyName ?? string.Empty) != string.Empty); LINQ是否有更好的(更本土化的)处理方式 编辑 道歉!没有包括提供商。。。这是使用LINQtoSQL这可以很好地使用LINQtoObject。但是,一些L

我想做一个这样的查询

query.Where(x => !string.IsNullOrEmpty(x.PropertyName));
但它失败了

所以现在我已经实现了以下功能,可以正常工作

query.Where(x => (x.PropertyName ?? string.Empty) != string.Empty);
LINQ是否有更好的(更本土化的)处理方式

编辑


道歉!没有包括提供商。。。这是使用LINQtoSQL

这可以很好地使用LINQtoObject。但是,一些LINQ提供程序在作为查询的一部分运行CLR方法时遇到困难。对于某些数据库提供者来说尤其如此

问题在于,DB提供者试图将LINQ查询作为数据库查询进行移动和编译,以防止将所有对象拉过连接。这是一件好事,但有时会限制谓词的灵活性


不幸的是,如果不检查提供者文档,就很难始终准确地知道提供者中直接支持或不支持的内容。看起来您的提供者允许比较,但不允许字符串检查。我猜,在你的情况下,这可能是你能得到的最好的方法。(除了创建“string.Empty”实例进行比较之外,它与IsNullOrEmpty检查没有什么不同,但这是次要的。)

这不会在LINQ2对象上失败,但会在Linq2SQL上失败,因此我假设您正在谈论SQL提供程序或类似的东西

原因与SQL提供程序处理lambda表达式的方式有关。它不把它当作函数,而是一个表达式。它接受表达式树并将其转换为实际的SQL语句,并将其发送到服务器

转换器知道如何处理基本运算符,但不知道如何处理对象上的方法。它不知道
IsNullOrEmpty(x)
转换为
returnx==null | | x==string.empty
。必须明确地这样做,才能将其转换为SQL。

问题陈述
可以将LINQ写入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.
2.

3.

你能解释一下它为什么失败吗?什么样的价值观是你所不期望的。我看不出这个特定的代码有任何错误(或者它与第二个示例有什么区别)?SQL、实体、对象……?我假设您的LINQ提供程序不支持String.IsNullOrEmpty(),导致NotSupportedException。它无法将String.IsNullOrEmpty映射到SQL。似乎这是微软的问题。一个“可能的解决方案”是用
ToList()
像这样将记录带到C#world
query.ToList()。其中(…)
但这可能会严重影响您的性能,因此,如果需要,请明智地使用它。一个非常简单的解决方案是只使用
item.SomeField.Length>0
-在sql中不会得到空引用。这类似于
LEN(SomeField)>0
,它也适用于空字段。