Comment réécrire les expressions de requête pour remplacer les énumérations par ints?

c# entity-framework entity-framework-4.1 expression-trees reflection

Question

Inspiré par le désir de pouvoir utiliser des énumérations dans les requêtes EF, je songe à ajouter un ExpressionVisitor à mes référentiels qui prendra les critères de spécification entrants pour les réécrire afin d'utiliser la propriété int persistante correspondante.

J'utilise régulièrement le modèle Valeur-suffixe suivant dans mes entités (code d'abord):

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; }
    }
}

Et mappez ceci à la base de données en utilisant les éléments suivants:

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; }
    }
}

J'ai dans mes dépôts la méthode suivante:

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; }
    }
}

J'aimerais ajouter un appel de méthode dans cette méthode pour réécrire l'expression de filtre, en remplaçant toutes les références à la propriété MemberStatus par des références à MemberStatusValue.

Je suppose que ce sera une solution impliquant quelque chose comme ce qui est vu dans cet article , mais je ne sais pas exactement comment aller de l'idée à la mise en œuvre.

Si vous pouviez donner des conseils sur l’impact potentiel de l’ajout de cette fonctionnalité sur les performances, nous vous en serions reconnaissants.

Réponse populaire

Je ne sais pas si c'est vraiment ce que vous recherchez, mais j'ai trouvé plus simple de gérer des énumérations de manière similaire mais légèrement différente. À savoir, j'ai deux propriétés, comme vous, mais ma propriété int est publique et est ce que la base de données persiste; J'ai ensuite une autre propriété "wrapper" publique qui obtient / définit la valeur de la propriété int via des transferts depuis / vers le type énuméré souhaité, qui est ce qui est réellement utilisé par le reste de l'application.

En conséquence, je n'ai pas besoin de jouer avec le modèle; EF comprend et persiste parfaitement la propriété int alors que le reste de l'application obtient de bonnes interactions avec le type enum. La seule chose que je n'aime pas dans mon approche, c'est que je dois écrire mes instructions LINQ avec un grand nombre d'incantations sur n'importe quelle valeur enum que j'essaie d'interroger pour la transformer en un entier pour qu'il corresponde à la réalité. Cependant, c'est un petit prix, et j'aimerais vous le suggérer, car il me semble que vous utilisez une chaîne pour générer votre requête, qui renonce à tout le type safety, Intellisense, etc. fourni par LINQ.

Enfin, si vous souhaitez savoir comment utiliser les nouvelles fonctionnalités d’enum dans EF 5 (disponible dès maintenant en version bêta si vous souhaitez l’essayer), consultez la page suivante:

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




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi