我有一个使用以下方法的通用存储库
IQueryable<T> GetAllByFilter(Expression<Func<T, bool>> expression);
我现在正在尝试通过前端提供搜索功能,其中一个或多个参数可能已输入或留空。我在为空参数短路表达式时遇到问题。
可以通过在存储库上调用以下示例来演示该问题:
public IEnumerable<Foo> Search(string param)
{
var filteredFoos = _fooRepository.GetAllByFilter(
f => string.IsNullOrEmpty(param) || f.Something == param );
return filteredFoos.ToList(); // throws exception
}
使用ToList()
throws枚举查询is 。System.NullReferenceException
param
null
我既不明白这一点,也不知道如何解决它,所以任何指针表示赞赏。谢谢。
更新:为了回应下面的评论,我添加了一个空检查。我的实际代码现在看起来像这样
var test1 = _repository.GetAllByFilter(
r => r != null &&
(string.IsNullOrEmpty(param)
|| (r.Field != null && r.Field.IndexOf(param.Trim()) != -1)));
var test2 = test1.ToList(); // exception here
我仍然没有看到问题可能出在哪里。
编辑:作为对评论的回应,通用存储库GetAllByFilter
代码:
public IQueryable<T> GetAllByFilter(Expression<Func<T, bool>> expression)
{
return _dataContext.GetTable<T>().Where(expression);
}
请注意,如果我运行一个简单的GetAll
查询
public IQueryable<T> GetAll()
{
return _dataContext.GetTable<T>();
}
在同一张表上,不null
返回任何记录(如预期的那样)。