Как мне переписать выражения запроса, чтобы заменить перечисления на целые числа?

Вдохновленный желанием иметь возможность использовать перечисления в запросах EF, я рассматриваю возможность добавления ExpressionVisitor в мои репозитории, которые будут принимать входящие критерии / критерии спецификаций и переписывать их, чтобы использовать соответствующее постоянное свойство int.

Я постоянно использую следующий шаблон суффикса значения в своих сущностях (сначала код):

public class User : IEntity
{
    public long ID { get; set; }

    internal int MemberStatusValue { get; set; }

    public MemberStatus MemberStatus 
    {
        get { return (MemberStatus) MemberStatusValue; }
        set { MemberStatusValue = (int) value; }
    }
}

И сопоставляю его с базой данных, используя следующее:

internal class UserMapping : AbstractMappingProvider<User>
{
    public override void DefineModel( DbModelBuilder modelBuilder )
    {
        // adds ToTable and other general mappings
        base.DefineModel( modelBuilder );

        Map.Property( e => e.MemberStatusValue ).HasColumnName( "MemberStatus" );
    }
}

В моих репозиториях у меня есть следующий метод:

public IQueryable<T> Query( Expression<Func<T, bool>> filter, params string[] children )
{
    if( children == null || children.Length == 0 )
    {
        return Objects.Where( filter );
    }
    DbQuery<T> query = children.Aggregate<string, DbQuery<T>>( Objects, ( current, child ) => current.Include( child ) );
    return filter != null ? query.Where( filter ) : query;
}

Я хотел бы добавить вызов метода внутри этого метода, чтобы переписать выражение фильтра, заменив все ссылки на свойство MemberStatus ссылками на MemberStatusValue.

Я полагаю, что это будет решение, включающее что-то вроде того, что было замечено в этом сообщении SO , но я не уверен, как именно перейти от идеи к реализации.

Если вы можете дать какой-либо совет о потенциальном влиянии добавления этой функции на производительность, это также будет признательно.

17
задан Community 23 May 2017 в 12:26
поделиться