这里我试图获取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;
}
}
答案 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]
要么尝试写几行(这样做没有错,你可能会获得可读性)