2009-07-11 4 views
3

[Флаги]Nhibernate Icriteria Enum флаги (битовая маска) поддержка

public enum ShowProductOn : short 

{ 

    HomePage = 1, 

    SalesPage = 2, 

    NewsLetter = 4 

}; 

Допустимые значения для этого перечисления:

1 - HomePage

2 - SalesPage

3 - HomePage, SalesPage

4 - NewsLetter

5 - HomePage, NewsLetter

6 - SalesPage, NewsLetter

7 - HomePage, SalesPage, NewsLetter

Я хотел бы написать критерии, который возвращает все продукты на главной странице. Чтобы проверить это в C# очень просто:

если ((MY_PARAM & ShowProductOn.HomePage) == ShowProductOn.HomePage)

Console.WriteLine("Yes"); 

в Sql это также очень просто:

DECLARE @BitMask INT = 3

ЕСЛИ ((@BitMask & 1) = 1)

НАЧАТЬ

Print('Yes') 

END

Это Критерии NH, что я написал, чтобы вернуть все продукты на главной странице (должно соответствовать 1 | 3 | 5 | 7):

критерии ICriteria = NHibernateSession.CreateCriteria() .Add (Restrictions.Eq («ShowProductOn», ShowProductOn.HomePage));

Этот критерий возвращает только элементы с «ShowProductOn» = 1, но игнорирует другие согласованные элементы с помощью «ShowProductOn» = 3 | 5 | 7.

Кто-нибудь знает синтаксис ICriteria/HQL, чтобы написать критерии, которые возвратят все элементы с помощью «ShowProductOn» = 1 | 3 | 5 | 7?

Shay.

ответ

1

Я решил эту однозначное отображение на перечисление флага к типу строки, а затем с помощью Restrictions.Like для quering значений: определение

Свойства:

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

отображения недвижимости (с использованием HBM ,XML-файл)

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

И, наконец, запрос критерии:

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

Надеется, что это помогает.

Смежные вопросы