3

在 EF 中生成动态 where 子句时,我遇到了信息过载问题。一些解决方案看起来非常过时(我的目标是 .NET 4.5 和 EF 5)。

这是我所拥有的:

public enum PersonTypes
{
    Lazy = 1,
    Awesome = 2,
    SuperHero = 3
}

public bool IncludeLazyPeople { get; set; }
public bool IncludeAwesomePeople { get; set; }
public bool IncludeSuperHeroPeople { get; set; }

使用 EF 我需要查询与提供的布尔值匹配的人员类型。

我调查了这个: http ://www.albahari.com/nutshell/predicatebuilder.aspx

这就是我想出的:

// create an expression that would include none of the person types
var personTypeExpression = PredicateBuilder.False<DAL.Models.Person>();

if (IncludeLazyPeople)
    personTypeExpression = personTypeExpression.Or(person => person.PersonType == (int)PersonTypes.Lazy);

if (IncludeAwesomePeople)
    personTypeExpression = personTypeExpression.Or(person => person.PersonType == (int)PersonTypes.Awesome);

if (IncludeSuperHeroPeople)
    personTypeExpression = personTypeExpression.Or(person => person.PersonType == (int)PersonTypes.SuperHero);

// filter the people for all included types
var filteredPeople = ctx.People.Where(personTypeExpression);

那没有用,因为我没有包含 AsExpandable 扩展。在我尝试之前,我想知道是否有更简单的方法?

4

2 回答 2

0
var query = context.People.AsQueryable();

if (IncludeLazyPeople)
    query = query.Where(person => person.PersonType == (int)PersonTypes.Lazy);

if (IncludeAwesomePeople)
    query = query.Where(person => person.PersonType == (int)PersonTypes.Awesome);

if (IncludeSuperHeroPeople)
    query = query.Where(person => person.PersonType == (int)PersonTypes.SuperHero);

如果您只需要AND逻辑,那么您可以Where()在查询中调用其他方法。否则,如果您需要更强大的选项,请使用谓词构建器或System.Linq.Expressions

于 2013-04-06T22:52:04.213 回答
0
ParameterExpression p = Expression.Parameter(typeof(Person));
Expression personType = Expression.MakeMemberAccess(p, typeof(Person).GetProperty("PersonType"));
Expression personTypeExpression = Expression.Constant(false);
if (IncludeLazyPeople)
    personTypeExpression = Expression.OrElse(personTypeExpression, Expression.Equal(personType, Expression.Constant((int)PersonTypes.Lazy)));

//... same as above only with different Constant values

// filter the people for all included types
var filteredPeople = ctx.People.Where(Expression.Lambda<Func<Person,bool>>(personTypeExpression,p));

这应该大致符合您的要求。没有检查编译器,希望没有太多错别字。

于 2013-04-06T23:05:31.977 回答