2009-07-11 6 views
3

[Flags]Nhibernate ICriteria Enum-Flags (BitMask) Unterstützung

public enum ShowProductOn : short 

{ 

    HomePage = 1, 

    SalesPage = 2, 

    NewsLetter = 4 

}; 

Gültige Werte für diese Enumeration:

1 - HomePage

2 - sales

3 - HomePage, Sales

4 - NewsLetter

5 - HomePage, NewsLetter

6 - sales, NewsLetter

7 - HomePage, Sales, NewsLetter

Ich mag ein Kriterium schreiben, die die Produkte alle auf der Homepage zurück. es in C# Um zu prüfen, ist sehr einfach:

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

Console.WriteLine("Yes"); 

in Sql auch, es ist sehr einfach:

DECLARE @BitMask int = 3

IF ((@BitMask & 1) = 1)

BEGIN

Print('Yes') 

END

Dies ist die NH-Kriterien, die ich alle Produkte auf der Homepage zurückzukehren schrieb (sollte 1 entsprechen | 3 | 5 | 7):

ICriteria Kriterien = NHibernateSession.CreateCriteria() .Add (Restrictions.Eq ("ShowProductOn", ShowProductOn.HomePage));

Diese Kriterien gibt nur Einträge mit "ShowProductOn" = 1, aber ignoriert die anderen abgestimmt Artikel mit "ShowProductOn" = 3 | 5 | 7.

Hat jemand die ICriteria/HQL-Syntax kennt Kriterien zu schreiben, die alle Einzelteile mit "ShowProductOn" zurück = 1 | 3 | 5 | 7?

Shay.

Antwort

1

I löste dieses man das Flag enum-Typ in einen String abbildet, dann Restrictions.Like für Quering Werte verwendet:

Eigenschaftsdefinition:

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

Objektzuordnung (unter Verwendung von HBM .XML-Datei)

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

Und schließlich die Kriterien query:

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

Hoffnung, das hilft.

Verwandte Themen