Comment utiliser LINQ Contient() pour trouver une liste des énumérations?
J'ai un enum appelé OrderStatus
, et il contient les différents statuts, un Ordre peut être dans:
- Créé
- En attendant
- Attente
- Valide
- Active
- Traitées
- Terminé
Ce que je veux faire est de créer un LINQ déclaration qui va me dire si le OrderStaus est Valide, Active, Traitées ou de les compléter.
Droit maintenant, j'ai quelque chose comme:
var status in Order.Status.WHERE(status =>
status.OrderStatus == OrderStatus.Valid ||
status.OrderStatus == OrderStatus.Active||
status.OrderStatus == OrderStatus.Processed||
status.OrderStatus == OrderStatus.Completed)
Qui fonctionne, mais c'est très "bavard". Est-il un moyen de convertir cette Contains()
déclaration et de raccourcir un peu?
Vous devez vous connecter pour publier un commentaire.
Sûr:
Vous pouvez également définir une méthode d'extension
In()
qui accepterait un objet et un tableau params, et fondamentalement encapsule la fonction contains:Cela permet de spécifier la condition d'une plus SQL-ish sorte:
Comprendre que pas tous les fournisseurs Linq comme de coutume les méthodes d'extension dans leur lambdas. NHibernate, par exemple, de ne pas traduire correctement le() De la fonction sans codage supplémentaire pour étendre l'analyseur d'expression, mais Contient() fonctionne très bien. Pour Linq 2 Objets, pas de problèmes.
J'ai utilisé cette extension:
Vous pouvez utiliser ce que la condition:
Si que l'ensemble des statuts a quelque sens, par exemple, celles qui sont les statuts de commandes acceptées, vous pouvez définir une méthode d'extension sur votre enum et utilisez-la dans votre requête linq.
Même si vous ne pourriez pas donner la méthode qu'un simple nom, vous pouvez utiliser quelque chose comme
IsValidThroughCompleted
. Dans les deux cas, il semble véhiculer un peu plus de sens de cette façon.Assumnig que l'enum est défini dans l'ordre que vous avez spécifié dans la question, vous pouvez le raccourcir à l'aide d'une comparaison des entiers.
Ce type de comparaison, même si elle peut être considérée feuilletée. Un il suffit de le re-ordonnancement des valeurs d'énumération serait silencieusement briser cette comparaison. Je préfère rester avec les plus verbeux version et probablement nettoyage par le refactoring, la comparaison à une méthode distincte.
Vous pourriez mettre dans une collection, et l'utilisation: