Inspirado por el deseo de poder usar enumeraciones en las consultas de EF, estoy considerando agregar un ExpressionVisitor a mis repositorios que tomará los criterios entrantes de criterios/especificaciones y los reescribirá para usar la propiedad int persistente correspondiente.¿Cómo reescribo las expresiones de consulta para reemplazar las enumeraciones por ints?
Estoy constantemente utilizando el siguiente patrón de valor sufijo en mis entidades (código-primera):
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; }
}
}
y Mapa esto a la base de datos utilizando la siguiente:
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");
}
}
En mi repositorios que tienen el siguiente método:
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;
}
me gustaría añadir una llamada de método dentro de este met od para reescribir la expresión de filtro, reemplazando todas las referencias a la propiedad MemberStatus con referencias a MemberStatusValue.
Supongo que será una solución que implica algo como visto in this SO post, pero no estoy seguro exactamente cómo pasar de la idea a la implementación.
Si puede dar algún consejo sobre el impacto en el rendimiento potencial de agregar esta característica, eso también sería apreciado.
Echa un vistazo a este post: http://bit.ly/eUOi08 – Steven
Gracias, que se parece exactamente a la derecha .. investigará! –
También tenga en cuenta que la última versión de EF (el CTP de junio) tiene soporte nativo para las enumeraciones, y la próxima versión oficial (4.2) lo hará oficial - http://blogs.msdn.com/b/adonet/archive/2011 /06/30/walkthrough-enums-june-ctp.aspx –