3 Stimmen

Nhibernate Icriteria Enum-Flags (BitMask) Unterstützung

[Flaggen]

public enum ShowProductOn : short

{

    HomePage = 1,

    SalesPage = 2,

    NewsLetter = 4

};

Gültige Werte für diese Aufzählung:

1 - Startseite

2 - VerkaufsSeite

3 - HomePage, Verkaufsseite

4 - Nachrichtenbrief

5 - Startseite, NewsLetter

6 - Verkaufsseite, NewsLetter

7 - Startseite, Verkaufsseite, NewsLetter

Ich würde gerne ein Kriterium schreiben, das alle Produkte auf der Homepage zurückgibt. Um es in c# zu überprüfen ist sehr einfach:

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

Console.WriteLine("Yes");

in Sql ist es auch sehr einfach:

DECLARE @BitMask int = 3

WENN ((@BitMask & 1) = 1)

BEGIN

Print('Yes')

ENDE

Dies ist das NH-Kriterium, das ich geschrieben habe, um alle Produkte auf der Homepage zurückzugeben (sollte 1|3|5|7 entsprechen):

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

Dieses Kriterium liefert nur Artikel mit "ShowProductOn"=1, ignoriert aber die anderen übereinstimmenden Artikel mit "ShowProductOn"=3|5|7.

Kennt jemand die ICriteria /HQL-Syntax, um ein Kriterium zu schreiben, das alle Artikel mit "ShowProductOn"=1|3|5|7 zurückgibt?

Shay.

3voto

nabeelfarid Punkte 4026

1voto

Siroman Punkte 11

Ich löste diese eine Zuordnung der Flagge enum zu einem String-Typ, dann mit Restrictions.Like für die Abfrage von Werten:

Definition der Eigenschaft:

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

Eigenschaftszuordnung (mit der Datei hbm.xml)

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

Und schließlich die Kriterienabfrage:

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

Ich hoffe, das hilft.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X