实体框架非静态方法需要一个目标。 Lambda

时间:2015-08-10 18:21:21

标签: c# linq entity-framework lambda

我在使用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();

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

1 个答案:

答案 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表达式的问题。