【问题标题】:How to deal with nulls in Linq to SQL with Regex.Replace on Property如何使用 Regex.Replace on Property 处理 Linq to SQL 中的空值
【发布时间】:2017-07-28 15:40:44
【问题描述】:

以下代码部分来自较大的 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*)", ""),

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

当类别为空时,我会遇到异常,因为它显然是在尝试对属性名称执行替换操作。

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

【问题讨论】:

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


【解决方案1】:
  • 如果您因为Sequence contains no elements 而在First() 上失败,则替换为.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*)", "");

【讨论】:

  • @Graham - 编辑没问题,但现在答案的第一部分缺少重要信息。只删除链接感到羞耻...
  • 我没有看到任何其他解释,并认为这是免费信息,无关紧要。在我们进行编辑时,我们知道原作者会收到通知,因此您可以返回并根据需要进行改进。
  • 我倾向于同意@GiladGreen 的观点,编辑是不必要的,删除的链接实际上对于答案的来源至关重要。
猜你喜欢
  • 2011-01-25
  • 1970-01-01
  • 2011-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-08
相关资源
最近更新 更多