Поддержка Nhibernate Icriteria Enum flags (BitMask) - PullRequest
3 голосов
/ 12 июля 2009

[Flags]

public enum ShowProductOn : short

{

    HomePage = 1,

    SalesPage = 2,

    NewsLetter = 4

};

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

1 - Домашняя страница

2 - SalesPage

3 - HomePage, SalesPage

4 - NewsLetter

5 - HomePage, NewsLetter

6 - SalesPage, NewsLetter

7 - HomePage, SalesPage, NewsLetter

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

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

Console.WriteLine("Yes");

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

ОБЪЯВИТЬ @BitMask int = 3

IF ((@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?

Шей.

Ответы [ 2 ]

3 голосов
/ 12 июля 2010
1 голос
/ 02 августа 2012

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

Определение свойства:

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);

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...