J'ai un [Flags] ENUM comme ceci:Comment utiliser flags enums dans les requêtes Linq to Entities?
[Flags]
public enum Status
{
None = 0,
Active = 1,
Inactive = 2,
Unknown = 4
}
Un ENUM d'état peut contenir deux valeurs telles que:
Status s = Status.Active | Status.Unknown;
Maintenant, je dois créer une requête LINQ (LINQ to ADO.NET Entités) et demander des enregistrements dont le statut est s ci-dessus, c'est-à-dire Actif ou Inconnu;
var result = from r in db.Records
select r
where (r.Status & (byte)s) == r.Status
Bien sûr, j'obtiens une erreur, car LINQ to Entities ne sait gérer que les types primitifs dans la clause Where.
L'erreur est:
Impossible de créer une valeur constante de type 'type de fermeture. Seuls les types primitifs ('tels que Int32, String et Guid') sont pris en charge dans ce contexte.
Existe-t-il un moyen pratique? Je peux avoir un statut Enum avec 10 valeurs possibles et interroger 5 des statuts. Comment puis-je construire la requête en utilisant Flags enum d'une manière élégante?
Merci.
Mise à jour
Cela semble être un problème LINQ to Entities. Je pense que dans LINQ to SQL cela fonctionne (pas sûr, n'a pas testé).
Vous êtes question (si cela a fonctionné) ne retournerait que les enregistrements dont le statut est simultanément 'Active' * et *' Unknown'. Est-ce que c'est ce que tu veux? – LukeH
Non, c'était un OU pas un ET. Donc 'Statut s = Statut.Actif | Statut inconnu;' est correct. Merci! –
@Vasi: Cette partie est correcte, mais "Status.Active | Status.Unknown'" est équivalent à "' 1 | 4' "qui est' 5'. Donc, votre clause 'where' dit effectivement" 'where (r.Status & 5) == r.Status'", qui est la même chose que "' where r.Status == 5' ", ce qui équivaut à dire (en anglais) "où' r.Status' est à la fois 'Active' * et *' Unknown' "! – LukeH