我在使用Lambda表达式的实体框架中遇到问题,其对象可以为null。我正在执行查询以通过某些字段在我的数据库中进行搜索,这些字段是可选的,如果字段为空,我不会将它用于查询中的条件,如果字段不为null,我在查询中使用它。 / p>
为此,我试图做这样的事情。
//Can be null or not
DateTime? date;
//This thorows an Exception "Non Static method needs a target"
List <> data = db.T_USER.Where(U =>
(date == null || U.JoinDate == date)
).ToList();
此代码抛出异常“非静态方法需要目标”
在这里搜索解决方案我发现查询中存在空值问题所以我尝试这样做。但即使第二部分的OR永远不会被评估,它也不起作用,因为第一部分是真的。
bool DateIsNull = (date == null);
//This thorows an Exception "Non Static method needs a target"
List <> data = db.T_USER.Where(U =>
(DateIsNull || U.JoinDate == date)
).ToList();
我的最终解决方案是这个,它的工作原理。但我觉得这段代码很难看。想象一下这个5个可选字段或更多字段的愚蠢代码......
//Can be null or not
DateTime? date;
bool DateIsNull = (date == null);
DateTime _filterDate = !DateIsNull ? date.Value : DateTime.Now;
List <> data = db.T_USER.Where(U =>
(DateIsNull || U.JoinDate == _filterDate)
).ToList();
有没有人为我的问题找到更好,更优雅的解决方案? 有人可以向我解释抛出异常的原因的细节吗?
答案 0 :(得分:5)
我通常处理此类场景的方式是根据哪些参数具有值来构建查询。像这样:
// optional query parameters coming from somewhere...
DateTime? date;
int? age;
string username;
IQueryable<T_USER> query = db.T_USER.AsQueryable();
if(date != null)
query = query.Where(u => u.JoinDate == date);
if(age != null)
query = query.Where(u => u.Age == age);
if(username != null)
query = query.Where(u => u.Username == username);
var results = query.ToList();
对我来说,这更容易阅读,它避免了将本地表达式或变量放入传递给EF提供程序的lambda表达式的问题。