簡體   English   中英

在數據表列的LINQ表達式中避免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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM