如何使用属性

时间:2017-07-28 15:40:44

标签: c# regex linq linq-to-sql

以下代码部分来自更大的linq查询,但它是我需要帮助的部分:

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*)", ""),

简短版本:查询的这一部分将获取文章的类别,但它不必具有值。如果它确实有值,我需要删除文本开头的编号。

我在类别为nu​​ll时获得异常,因为它显然试图对属性Name执行Replace操作。

如何添加代码来处理Null?返回一个空字符串是安全的,但我不确定如何测试它并返回一个空字符串。

1 个答案:

答案 0 :(得分: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*)", "");