C# 在Datatable列上的LINQ表达式中避免NullReferenceException
我的数据表“articles”中有空值。使用LINQ获取文章列表对于ArticleId列很有效,但是对于“ArticleVariations”列,空值会让我头疼C# 在Datatable列上的LINQ表达式中避免NullReferenceException,c#,linq,C#,Linq,我的数据表“articles”中有空值。使用LINQ获取文章列表对于ArticleId列很有效,但是对于“ArticleVariations”列,空值会让我头疼 var result = this.articles.AsEnumerable().Where(r =>r.Field<String>("ArticleId").Equals(artNo)); // works. no nulls there ;) var result = this.articles.AsEnume
var result = this.articles.AsEnumerable().Where(r =>r.Field<String>("ArticleId").Equals(artNo)); // works. no nulls there ;)
var result = this.articles.AsEnumerable().Where(r =>r.Field<String>("ArticleVariations").Equals(artNo)); // stuck with nulls here
var result=this.articles.AsEnumerable()。其中(r=>r.Field(“ArticleId”).Equals(artNo));//作品没有空值;)
var result=this.articles.AsEnumerable()。其中(r=>r.Field(“ArticleVariations”).Equals(artNo));//这里被空值卡住了
如果列包含null,则会出现NullReferenceException,是否可以以某种方式避免这种情况,是否可以合并这两个表达式?您可以使用和null合并运算符:
var result = this.articles.AsEnumerable()
.Where(r =>r.Field<String>("ArticleVariations")?.Equals(artNo) ?? false);
var result=this.articles.AsEnumerable()
其中(r=>r.Field(“ArticleVariations”)?.Equals(artNo)??false);
问题的出现显然是因为r.Field(“ArticleVariations”)
retunsnull
。因此,在调用Equals
之前,必须先检查null
为此,可以在LINQ表达式中调用多个语句:
var result = this.articles.AsEnumerable().Where(r => {
var res = r.Field<String>("ArticleVariations");
if (res != null) return res.Equals(artNo);
else return false;
});
var result=this.articles.AsEnumerable()。其中(r=>{
var res=r.字段(“条款变更”);
如果(res!=null)返回res.Equals(artNo);
否则返回false;
});
如果字段可以为空,则只需反转测试:
var result = this.articles.AsEnumerable().Where(r => artNo.Equals(r.Field<String>("ArticleVariations")));
其中
只接受一个函数,该函数返回一个bool
,以确定它是否应该从集合中筛选项目。您可以像编写任何其他函数一样,使用多语句体编写它,以使空值更易于处理。类似这样的事情应该是一个很好的起点:
.Where(r => {
string articleVariations = r.Field<string>("ArticleVariations");
return articleVariations != null && articleVariations.Equals(artNo);
});
。其中(r=>{
字符串articleVariations=r.Field(“articleVariations”);
返回articleVariations!=null&&articleVariations.Equals(artNo);
});
如果您想以某种方式组合这些检查以建立一个列表,其中一个或另一个给定字段与您的artNo
匹配,您可以将其添加到函数体中
如果列包含nulls,我会得到一个NullReferenceException,我能以某种方式避免它吗
尽可能避免使用实例等于
方法。使用相应的运算符或静态等于
方法,因为它们为您正确处理null
s
在您的具体案例中,最简单的方法是将Equals
替换为=
:
var result = this.articles.AsEnumerable()
.Where(r => r.Field<string>("ArticleId") == artNo);
var result = this.articles.AsEnumerable()
.Where(r => r.Field<string>("ArticleVariations") == artNo);
var result = this.articles.AsEnumerable()
.Where(r => r.Field<string>("ArticleId") == artNo);
var result = this.articles.AsEnumerable()
.Where(r => r.Field<string>("ArticleVariations") == artNo);
var result = this.articles.AsEnumerable()
.Where(r => r.Field<string>("ArticleId") == artNo
|| r => r.Field<string>("ArticleVariations") == artNo);