Linq:检查字符串列是否有值(即不为空或空字符串)

7

不确定这是否是在Linq中实现此目的的最佳方法。

我正在尝试选择CRM 2011中EMailAddress1包含值的联系人记录。我尝试了以下两个WHERE子句,但都引发了异常:

Where c.EMailAddress1 > ""

Where Not String.IsNullOrEmpty(c.EMailAddress1)

所以我最终尝试了这个方法,看起来还不错:
Where Not c.EMailAddress1.Equals(String.Empty) _
And Not c.EMailAddress1.Equals(Nothing)

但我不确定这是否是最有效的方法...它似乎不太优雅。是否有更简洁的方法来检查字符串列是否具有值?


1
当您使用String.IsNullOrEmpty时,您会得到什么异常? - Forte L.
EMailAddress1 是什么数据类型? - Forte L.
@ForteL。异常为“无效的'where'条件。实体成员正在调用无效的属性或方法。”数据类型为字符串。 - ingredient_15939
我指的是数据库中的数据类型。 - Forte L.
啊,不太确定,这是一个远程安装的CRM 2011,但我认为它应该是nvarchar类型。 - ingredient_15939
2个回答

5
此处所述,Linq to CRM十分有限。因此,您无法使用String.IsNullOrEmpty。

然而,您可以尝试这样做:

Where c.EMailAddress1 IsNot Nothing

当一个字段为空时,在数据库中它会被设置为null(不会是空的)。对于你的情况,这行代码就足够了。

祝好,

Kévin


谢谢提供链接。我也想检查 ""(空字符串,不是 null),所以仅使用 Nothing 是不够的。看起来必须使用两个条件来完成,这很公平。 - ingredient_15939
1
实际上,如果用户让字段为空,它将为NULL。如果您使用linq查找空字符串,您将永远不会找到任何结果。因此,“IsNot Nothing”应该足够了。 - Kévin Rapaille
这只是Linq的行为吗?许多数据库设计避免使用可空列。关于CRM 2011在这种情况下是否如此,不确定。但是假设数据库中的列为VarChar NOT NULL,则Linq是否会以不同的方式处理null和""(空)? - ingredient_15939
1
这是CRM 2011的行为。如果一个字段为空(=空字符串),CRM将在数据库中将其设置为NULL。在CRM数据库中,所有列都是可空的,要求由CRM程序本身管理,而不是由DB管理。这就是为什么您不必处理空字符串。它们在CRM中不存在。 - Kévin Rapaille

2

只需要做:

Where c.EmailAddress <> ""

这也会引发异常:“无效的'where'条件。实体成员调用了无效的属性或方法。” - ingredient_15939
Where(Function(s) s.EmailAddress <> "") = 工作正常!空值和空字符串不会被选中。 - Leszek P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接