C# 如何使用Regex.Replace on属性处理Linq to SQL中的空值
以下代码部分来自一个更大的linq查询,但我需要帮助:C# 如何使用Regex.Replace on属性处理Linq to SQL中的空值,c#,regex,linq,linq-to-sql,C#,Regex,Linq,Linq To Sql,以下代码部分来自一个更大的linq查询,但我需要帮助: KnowledgeTypeText = Regex.Replace((from categoryVersion in _Context.ArticleCategoryVersions join category in _Context.Categories on categoryVersion.Cate
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时会出现异常,因为它显然试图对属性名执行替换操作
如何添加代码来处理空值?返回空字符串是安全的,但我不确定如何测试它并返回空字符串 - 如果由于
序列不包含任何元素而导致
失败,请替换为First()
.FirstOrDefault()
- 如果您得到一个值,但它是
,然后在访问null
时在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*)", "");
你真的需要内联吗?为什么不直接提取select,然后在其上执行
FirstOrDefault
,如果该值不为null,则进行替换?是否为category
null?或者它是Name
propertynull
?或者序列中没有项目?可能重复@Graham-编辑没有问题,但现在答案的第一部分缺少重要信息。只是删除链接真丢脸……我没有看到任何其他的解释,我认为这是免费的信息,不重要。由于我们正在编辑,我们知道原始作者将得到通知,以便您可以回来,并根据您认为合适的方式进行改进。我倾向于同意@GiladGreen的观点,在这一点上,编辑是不必要的,删除的链接实际上对答案的来源至关重要。