如何处理C#中的空?

时间:2018-01-19 07:14:12

标签: c# entity-framework linq

这里我试图获取FormName,如果存在表格MainMenu的FormName列,但在此之前我试图检查列FormName是否包含表单名称

var chkURL = uow.Repository<MainMenu>().GetAll().Where(x => x.MenuId
== getMenuId && x.IsVisible == 1).Select(x => x.FormName).FirstOrDefault().Any();

但是它显示错误'值不能为空',即使所有参数(即getMenuId,IsVisible = 1)都包含正确的数据。

以下是我的代码

    public string GetChildNodeForm(string menuTitle)
    {
        var getMenuId = uow.Repository<MainMenu>().FindBy(x => x.MenuTitle == menuTitle && x.IsVisible == 1).FirstOrDefault().MenuId;
        var chkURL = uow.Repository<MainMenu>().GetAll().Where(x => x.MenuId == getMenuId && x.IsVisible == 1).Select(x => x.FormName).FirstOrDefault().Any();
        if (chkURL == true)
        {
            return uow.Repository<MainMenu>().FindBy(x => x.MenuId == getMenuId && x.IsVisible == 1).FirstOrDefault().FormName.Trim();
        }
        else
        {
            return null;
        }
    }

3 个答案:

答案 0 :(得分:1)

方法FirstOrDefault可能会返回null,因此请勿在此处使用Any()方法。

var formName = uow.Repository<MainMenu>()
               .GetAll()
               .Where(x => x.MenuId == getMenuId && x.IsVisible == 1)
               .Select(x => x.FormName)
               .FirstOrDefault();
if(formName != null ) 
 {
   //TODO
 }

答案 1 :(得分:1)

我认为您在该行中遇到的问题是FirstOrDefault会返回与您的条件匹配的第一个FormName,如果没有匹配则返回null,然后您尝试调用关于该结果的Any

如果您要用Where替换该行中的Any,并删除其后的所有内容,那么您将检查是否有任何符合条件的项目:

var chkURL = uow.Repository<MainMenu>().GetAll()
    .Any(x => x.MenuId == getMenuId && x.IsVisible == 1);

然而,看看你的代码,看来你首先从菜单标题中查找菜单ID,然后你再次使用菜单ID检查是否有任何项目(?),最后您正试图通过菜单ID获取表单名称。

您可以通过简化代码来获取与菜单名称匹配的FirstOrDefault,而不是查询同一个对象,而不是查询同一个对象三次,只需执行一次,如果不是null,则获取FormName,如果那不是空的,Trim它并返回修剪过的表单名称(如果在此过程中有任何内容null,则返回null):

public string GetChildNodeForm(string menuTitle)
{
    return uow.Repository<MainMenu>().GetAll()
        .FirstOrDefault(x => x.MenuTitle == menuTitle && x.IsVisible == 1)
        ?.FormName?.Trim();
}

答案 2 :(得分:1)

!String.IsNullOrEmpty([linqQueryUntilFirstOrDefault()])将检查是否存在与条件匹配的非空字符串,如果没有结果则会抛出错误,并且至少为此目的设计,这是不是.Any()的情况(因为当您的结果为null时会抛出null异常)

此外,我建议您将var标记替换为bool,以便阅读代码的人不会对您期望的结果感到困惑,然后您可以删除== true上的if chkUrl已经是布尔值。

更一般地说,请注意.FirstOrDefault().[anything],因为.FirstOrDefault()可以返回null。所以要么使用.FirstOrDefault()?.[anything]要么尝试写几行(这样做没有错,你可能会获得可读性)