17

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.

+1

Echa un vistazo a este post: http://bit.ly/eUOi08 – Steven

+0

Gracias, que se parece exactamente a la derecha .. investigará! –

+3

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 –

Respuesta

1

No estoy seguro de si esto es bastante lo que buscas, pero me ha resultado más fácil de manejar enumeraciones de una manera similar pero ligeramente diferente. A saber, tengo dos propiedades, como tú, pero mi propiedad int es pública y es lo que la base de datos persiste; Luego tengo otra propiedad pública "contenedora" que obtiene/establece el valor de la propiedad int mediante moldes desde/hacia el tipo enumerado deseado, que es lo que realmente usa el resto de la aplicación.

Como resultado, no tengo que perder el tiempo con el modelo; EF entiende y persiste la propiedad int muy bien, mientras que el resto de la aplicación obtiene buenas interacciones con el tipo de enumeración. Lo único que no me gusta de mi enfoque es que tengo que escribir mis declaraciones LINQ con un montón de conversiones sobre cualquier valor enum que estoy tratando de consultar para convertirlo en un int para que coincida con el campo que realmente persiste. Sin embargo, es un precio pequeño, y me gustaría sugerírselo, porque me parece que está utilizando una cadena para generar su consulta, que renuncia a todo tipo de seguridad, Intellisense, etc., que proporciona LINQ.

Finalmente, si está interesado en un tutorial sobre cómo usar las nuevas funciones enum en EF 5 (que está disponible en versión beta para descargar ahora si desea probarlo), mire esto:

http://msdn.microsoft.com/en-us/hh859576

+0

Gracias, pero te has perdido la marca en algunos artículos: no estoy usando cadenas pero persistiendo la int tal como eres.El motivo de mis dos propiedades y el mapeo es que puedo asignar el valor int a una columna con el nombre de la propiedad enum, lo que facilitará la transición a EF5 en una etapa posterior. Mis consultas usan int como tuyo, pero me parece una molestia tener que utilizar el casting, especialmente porque no puedes convertir la enumeración en línea en la consulta, por lo que debes declararle una variable. La respuesta que estoy buscando debe proporcionar un código para volver a escribir el gráfico de expresión de consulta y hacer las conversiones enum. –

Cuestiones relacionadas