实体框架非静态方法需要一个目标.Lambda中的空值

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)

有没有人为我的问题找到更好,更优雅的解决方案?有人可以向我解释抛出异常的原因的细节吗?

Pet*_*ter 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();
Run Code Online (Sandbox Code Playgroud)

对我来说,这更容易阅读,它避免了将本地表达式或变量放入传递给EF提供程序的lambda表达式的问题.

  • 我不确定我理解为什么这个解决方案对你不起作用...因为查询得到了每个语句的"建立"并且只在最后评估并发送到数据库 - 当你调用`ToList()时` - 它可以处理多种参数组合. (2认同)