以下代码部分来自更大的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时获得异常,因为它显然试图对属性Name执行Replace操作。
如何添加代码来处理Null?返回一个空字符串是安全的,但我不确定如何测试它并返回一个空字符串。
答案 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*)", "");