我在数据表"文章"中遇到了空值。使用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,我可以以某种方式避免这种情况,是否可以合并两个表达式?
答案 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);