Linq to Entity - 如何连接条件

时间:2011-07-21 14:15:59

标签: c# linq-to-entities

我正在写一个Linq查询。有没有一种方法可以根据一些if条件连接查询?

就像查询一样

    from res in _db.Person
    where res.Departments.ID == deptId
    select res;

如果我的条件是真的,我希望它像

from res in _db.Person
    where res.Departments.ID == deptId && res.Departments.Type == deptType
    select res;

3 个答案:

答案 0 :(得分:5)

使用扩展方法语法多次调用Where,实现“AND”类型条件很容易 - 而且更容易:

IQueryable<Person> people = _db.Person
                               .Where(res => res.Departments.ID == deptId);
if (deptType != null)
{
    people = people.Where(res => res.Departments.Type == deptType);
}

// Potentially add projections etc.

编辑:如果你想要“OR”功能,从头开始有点棘手,因为你需要搞乱表达树。我建议你使用PredicateBuilder库:

Expression<Func<Person, bool> predicate = res => res.Departments.ID == deptId;
if (deptType != null)
{
    predicate = predicate.Or(res => res.Departments.Type == deptType);
}
IQueryable<Person> people = _db.Person.Where(predicate);

答案 1 :(得分:3)

假设您的情况处于可变状态

from res in _db.Person
where res.Departments.ID == deptId && (!condition || res.Departments.Type == deptType)
select res;

执行或按要求的版本

from res in _db.Person
where res.Departments.ID == deptId || (condition && res.Departments.Type == deptType))
select res;

或者,您可以使用predicate builder

答案 2 :(得分:1)

我会做这样的事情:

var result = _db.Person.Where(x=>x.Departments.ID == deptId);
if(myCondition)
   result = result.Where(x=>x.Departments.Type == deptType);

在您尝试枚举result之前,查询实际上并未执行,因此您可以根据需要继续添加条件。