[英]IQueryable with Linq expression resulting in NullReferenceException
[英]Avoid NullReferenceException in LINQ Expression on Datatable column
我在數據表“文章”中陷入了空值。 使用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,是否可以避免這種情況,並且可以合並兩個表達式?
您可以使用空條件運算符和空伙伴運算符:
var result = this.articles.AsEnumerable()
.Where(r =>r.Field<String>("ArticleVariations")?.Equals(artNo) ?? false);
因為r.Field<String>("ArticleVariations")
重新調整了null
所以顯然會出現問題。 因此,你必須檢查null
之前調用Equals
就可以了。
為此,您可以在LINQ表達式中調用多個語句:
var result = this.articles.AsEnumerable().Where(r => {
var res = r.Field<String>("ArticleVariations");
if (res != null) return res.Equals(artNo);
else return false;
});
如果該字段可以為null,則只需反轉測試即可:
var result = this.articles.AsEnumerable().Where(r => artNo.Equals(r.Field<String>("ArticleVariations")));
然后,您需要做的就是在進行調用之前檢查artNo
不為null:
List<Type> result;
if (string.IsNullOrWhiteSpace(artNo))
{
result = new List<Type>();
}
else
{
result = this.articles.... as before
}
Where
僅使用一個返回bool
的函數來確定是否應從集合中過濾出一個項目。 您可以像其他函數一樣使用多語句主體來編寫它,以使空值更易於處理。 這樣的事情應該是一個很好的起點:
.Where(r => {
string articleVariations = r.Field<string>("ArticleVariations");
return articleVariations != null && articleVariations.Equals(artNo);
});
如果您想以某種方式組合這些檢查以構建一個列表,其中一個或另一個給定字段與您的artNo
相匹配,則可以將其添加到函數主體中。
如果該列包含空值,則會收到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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.