如何将动态EF查询与OR值一起使用

时间:2014-10-15 10:03:23

标签: c# linq entity-framework

如何将动态EF查询与OR值一起使用。我希望这次PeopleGroups 3或4中有所有人,但下次可能PeopleGroups 5或8

这项工作,硬编码。 PeopleGroups不是主要Id

var Peoples = db.People.Where(_ => (_.PeopleGroups == 3 || _.PeopleGroups == 4));

但如何让它变得动态?我想到了.Contains(),但我认为它只适用于主Id

var searchPeopleGroups = new List<int> { 3, 4 };  
var Peoples = db.People.Where(_ => searchPeopleGroups.Contains(_.PeopleGroups));

1 个答案:

答案 0 :(得分:1)

.Contains()方法将起作用,并应在生成的SQL查询中生成IN子句。

如果您想要一个真正动态的解决方案,在生成的SQL查询中生成OR语句,我建议使用LinqKit框架以及包含的PredicateBuilder类。

如果您包含LinqKit,您的查询可能会变得类似于:

Expression<Func<People, bool>> predicate = PredicateBuilder.False<People>();

foreach (var g in searchPeopleGroups)
{
    predicate = predicate.Or(p => p.PeopleGroups == g);
}

var Peoples = db.People.AsExpandable().Where(predicate.Expand());