2009-07-11 8 views
3

[Flags]Nhibernate Icriteria drapeaux ENUM (bitmask) de support

public enum ShowProductOn : short 

{ 

    HomePage = 1, 

    SalesPage = 2, 

    NewsLetter = 4 

}; 

valeurs valides pour cette énumération:

1 - page

2 - salespage

3 - page de garde, salespage

4 - NewsLetter

5 - HomePage, NewsLetter

6 - salespage, NewsLetter

7 - HomePage, salespage, NewsLetter

Je voudrais écrire un critère qui renvoie tous les produits sur la page d'accueil. Pour le vérifier en C# est très simple:

if ((MY_PARAM & ShowProductOn.HomePage) == ShowProductOn.HomePage)

Console.WriteLine("Yes"); 

dans Sql il est aussi très simple:

DECLARE @BitMask int = 3

IF ((@BitMask & 1) = 1)

BEGIN

Print('Yes') 

FIN

Voici les critères NH que j'ai écrit à retourner tous les produits sur la page d'accueil (doit correspondre à 1 | 3 | 5 | 7):

critères ICriteria = NHibernateSession.CreateCriteria() .Add (Restrictions.Eq ("ShowProductOn", ShowProductOn.HomePage));

Ce critère renvoie uniquement les éléments avec "ShowProductOn" = 1 mais ignore les autres éléments correspondants avec "ShowProductOn" = 3 | 5 | 7.

Quelqu'un connaît-il la syntaxe ICriteria/HQL pour écrire un critère qui retournera tous les éléments avec "ShowProductOn" = 1 | 3 | 5 | 7?

Shay.

Répondre

1

Je résolus celui cartographier le ENUM de drapeau à un type de chaîne, puis en utilisant Restrictions.Like pour les valeurs Quering:

définition de la propriété:

public virtual DaysOfWeek Weekdays { 
    get { return (DaysOfWeek)System.Enum.Parse(typeof(DaysOfWeek), _weekdays); } 
    set { _weekdays = value.ToString(); } 
} 
private string _weekdays = "All"; 

cartographie de propriété (en utilisant HBM .fichier xml)

<property name="Weekdays" column="WEEKDAYS" access="field.camelcase-underscore" not-null="false" /> 

Et enfin la requête de critères:

Restrictions.Like("Weekdays", ConvertToDaysOfWeek(time.DayOfWeek).ToString(), MatchMode.Anywhere); 

Hope this helps.

Questions connexes