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