2017-07-28 50 views
1

下面的代碼部分是從更大的LINQ查詢,但它是一個我需要幫助:如何處理Linq中的空值與Regex.Replace到SQL的房產

KnowledgeTypeText = Regex.Replace((from categoryVersion in _Context.ArticleCategoryVersions 
            join category in _Context.Categories 
            on categoryVersion.CategoryID equals category.CategoryID 
            where category.ParentID.HasValue == true 
            && category.ParentID.Value == rootKnowledgeTypeID 
            && categoryVersion.Version == articleLatestVersions.Version 
            && categoryVersion.ArticleID == articleLatestVersions.ArticleID 
            select category).First().Name, @"(\d+[\\.]?\s*)", ""), 

短版:查詢的這一部分將爲一篇文章獲取一個類別,但不一定非要有一個值。如果它有一個值,我需要在文本的開頭去掉數字。

當類別爲空時,我收到了異常,因爲它顯然是試圖對屬性Name執行Replace操作。

如何添加代碼來處理空值?返回一個空字符串是安全的,但我不知道如何測試它並返回一個空字符串。

+0

你真的需要內聯嗎?爲什麼不提取select,對其執行'FirstOrDefault',然後替換該值是否爲空? – icebat

+0

'category'null?或者它是'Name'屬性'null'?或者序列中沒有項目? –

+0

[在FirstOrDefault返回null的情況下從FirstOrDefault中選擇屬性的可能重複](https://stackoverflow.com/questions/19947464/selecting-a-property-from-firstordefault-in-case-firstordefault-returns-null) – Stefan

回答

2
  • 如果你失敗的First()因爲Sequence contains no elements然後用.FirstOrDefault()取代。
  • 如果你得到一個值,但它是null,然後訪問Name當空引用失敗,則使用.FirstOrDefault()?.Name
  • 如果是Name屬性,是null然後使用??

    (/* query */).FirstOrDefault()?.Name ?? string.Empty 
    

瞭解更多關於:


此外,它是更少可讀把它所有的嵌入這樣的(甚至更,因爲它似乎是在對象初始)。首先有查詢,然後做替換:

var result = (from categoryVersion in _Context.ArticleCategoryVersions 
       join category in _Context.Categories 
       on categoryVersion.CategoryID equals category.CategoryID 
       where category.ParentID.HasValue && 
       category.ParentID.Value == rootKnowledgeTypeID && 
       categoryVersion.Version == articleLatestVersions.Version && 
       categoryVersion.ArticleID == articleLatestVersions.ArticleID && 
       select category).FirstOrDefault()?.Name ?? string.Empty; 

KnowledgeTypeText = Regex.Replace(result, @"(\d+[\\.]?\s*)", ""); 
+0

@格拉姆姆 - 編輯沒問題,但現在答案的第一部分缺少重要信息。羞於刪除鏈接... –

+0

我沒有看到任何其他解釋,並認爲這是免費的信息,不重要。在我們編輯時,我們知道原作者將會收到通知,這樣您就可以回到原來的位置並進行改進。 – Graham

+0

我傾向於同意@GiladGreen這一個,編輯是不必要的,而刪除的鏈接對於答案的來源實際上是至關重要的。 – Jacques