C# 在Datatable列上的LINQ表达式中避免NullReferenceException

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

我的数据表“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.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”)
retuns
null
。因此,在调用
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);