避免在Datatable列上的LINQ表达式中使用NullReferenceException

时间:2016-02-01 15:44:37

标签: c# linq

我在数据表"文章"中遇到了空值。使用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

如果列包含空值,我会得到一个NullReferenceException,我可以以某种方式避免这种情况,是否可以合并两个表达式?

5 个答案:

答案 0 :(得分:2)

您可以使用null-conditional和空合并运算符:

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div class="sidebar-list">
  <h4>Type</h4>
  <ul>
    <li><a href="#" id='shop'>   Shop</a></li>
    <li><a href="#" id='food'>   Food</a></li>
    <li><a href="#" id='beauty'> Beauty</a></li>
    <li><a href="#" id='comfort'>Comfort</a></li>
    <li><a href="#" id='health'> Health</a></li>
    <li><a href="#" id='pet'>    Pet</a></li>
    <li><a href="#" id='fun'>    Fun</a></li>
    <li><a href="#" id='life'>   Life</a></li>
  </ul>
</div>

答案 1 :(得分:2)

问题显然是因为"SELECT * from CIM_DataFile WHERE Drive = 'C:'" 返回r.Field<String>("ArticleVariations")。因此,在调用null之前,您必须先检查null

为此,您可以在LINQ表达式中调用多个语句:

Equals

答案 2 :(得分:1)

如果该字段可以为null,则只需反转您的测试:

var result = this.articles.AsEnumerable().Where(r => artNo.Equals(r.Field<String>("ArticleVariations")));

然后,您需要做的就是在拨打电话前检查artNo是否为空:

List<Type> result;
if (string.IsNullOrWhiteSpace(artNo))
{
    result = new List<Type>();
}
else
{
    result = this.articles.... as before
}

答案 3 :(得分:0)

Where只需要一个返回bool的函数来确定它是否应该从集合中过滤掉一个项目。您可以像使用任何其他函数一样使用多语句体来编写它,以使空值更容易处理。这样的事情应该是一个很好的起点:

.Where(r => {
               string articleVariations = r.Field<string>("ArticleVariations");
               return articleVariations != null && articleVariations.Equals(artNo);
            });

如果你想以某种方式组合这些检查来建立一个列表,其中一个或另一个给定的字段与你的artNo匹配,你可以将它添加到函数体中。

答案 4 :(得分:0)

  

如果列包含空值,我会得到一个NullReferenceException,我可以以某种方式避免这种情况

尽可能避免使用实例 Equals方法。使用相应的运算符静态 Equals方法,因为它们可以正确处理null

在具体案例中,最简单的方法是将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);
  

是否可以合并两个表达式?

这取决于“合并”它们的含义。如果您的意思是通过传递的artNo匹配文章变体,那么您可以使用类似的内容

var result = this.articles.AsEnumerable()
    .Where(r => r.Field<string>("ArticleId") == artNo
        || r => r.Field<string>("ArticleVariations") == artNo);