Jua*_*DYB 2 c# linq lambda entity-framework
我在使用Lambda表达式的实体框架中遇到问题,其对象可以为null.我正在执行查询以通过某些字段在我的数据库中进行搜索,字段是可选的,如果字段为空,我不会将它用于查询中的条件,如果字段不为空,我在查询中使用它.
为此,我试图做这样的事情.
//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();
Run Code Online (Sandbox Code Playgroud)
此代码抛出一个异常"非静态方法需要一个目标"
在这里搜索解决方案我发现查询中存在null值的问题,所以我尝试这样做.但即使第二部分的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();
Run Code Online (Sandbox Code Playgroud)
我的最终解决方案是这个并且它有效.但我觉得这段代码很难看.想象一下这个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();
Run Code Online (Sandbox Code Playgroud)
有没有人为我的问题找到更好,更优雅的解决方案?有人可以向我解释抛出异常的原因的细节吗?
我通常处理这种情况的方式是根据哪些参数具有值来构建查询.像这样的东西:
// 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();
Run Code Online (Sandbox Code Playgroud)
对我来说,这更容易阅读,它避免了将本地表达式或变量放入传递给EF提供程序的lambda表达式的问题.