在Entity Framework Linq中的where子句中进行空检查

时间:2018-12-26 07:53:19

标签: c# asp.net-mvc entity-framework linq

我有一个返回null reference exception的查询。 我正在使用搜索过滤数据,放置了断点,并检查是否存在问题:当列具有空值时,它会返回exception

控制器

if (searchValue != null || searchValue != "")
{
     expheadlist = expheadlist.Where(e => 
                    e.Name.ToLower().Contains(searchValue) || 
                    e.Description.ToLower().Contains(searchValue) 
                    ).ToList<GenExpenseHead>();
}

我在Description属性中允许空值。该实体在Description列中为空值。我认为因此它在此代码中返回NullException。我不知道如何解决。

谢谢。

3 个答案:

答案 0 :(得分:3)

您不能在?.子句中编写??(空条件运算符)和Where(空合并运算符)。而是在查询中使用string.IsNullOrWhiteSpace,如下所示:

if (!String.IsNullOrWhiteSpace(searchValue))
{
     expheadlist = expheadlist.Where(e => (string.IsNullOrWhiteSpace(e.Name) || e.Name.ToLower().Contains(searchValue))
                    || (string.IsNullOrWhiteSpace(e.Description) || e.Description.ToLower().Contains(searchValue))
                    ).ToList<GenExpenseHead>();
}

此外,就像我以前使用的searchValue != null || searchValue != ""一样,您的string.IsNullOrWhiteSpace条件也很简单!

答案 1 :(得分:1)

一种解决方法是使用?.(空传播算子)和??(空合并算子):

expheadlist = expheadlist.Where(e => 
                    e.Name.ToLower().Contains(searchValue) || 
                    e.Description?.ToLower().Contains(searchValue) ?? false
                    ).ToList<GenExpenseHead>();

这表示如果Descriptionnull,则返回false防止异常,否则调用.ToLower().Contains(searchValue)

答案 2 :(得分:0)

使用?。 (空传播算子)和?? (空合并运算符),例如

expheadlist = expheadlist.Where(e => 
                e.Name?.ToLower().Contains(searchValue) ?? false || 
                e.Description?.ToLower().Contains(searchValue) ?? false
                ).ToList<GenExpenseHead>();