Вдохновленный желанием использовать перечисления в EF-запросах, я рассматриваю возможность добавления ExpressionVisitor в мои репозитории, который будет принимать входящие критерии / спецификации критериев и переписывать их для использования соответствующего свойства persisted int.
Я последовательно использую следующий шаблон Value-суффикс в моих (сначала кодовых) сущностях:
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 , но я точно не знаю, как перейти от идеи к реализации.
Если вы можетедайте какие-либо советы о возможном влиянии на производительность при добавлении этой функции, что также будет оценено.