【问题标题】:Nhibernate Icriteria Enum flags (BitMask) supportNhibernate Icriteria Enum 标志 (BitMask) 支持
【发布时间】:2009-07-11 23:25:55
【问题描述】:

[标志]

public enum ShowProductOn : short

{

    HomePage = 1,

    SalesPage = 2,

    NewsLetter = 4

};

此枚举的有效值:

1 - 主页

2 - 销售页面

3 - 主页、销售页面

4 - 时事通讯

5 - 主页、新闻通讯

6 - SalesPage、NewsLetter

7 - HomePage、SalesPage、NewsLetter

我想写一个标准来返回主页上的所有产品。 在 c# 中检查它非常简单:

如果 ((MY_PARAM & ShowProductOn.HomePage) == ShowProductOn.HomePage)

Console.WriteLine("Yes");

在Sql中也很简单:

声明@BitMask int = 3

IF ((@BitMask & 1) = 1)

开始

Print('Yes')

结束

这是我写的返回主页上所有产品的 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 的所有项目?

谢伊。

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    【讨论】:

      【解决方案2】:

      我解决了这个问题,将标志枚举映射到字符串类型,然后使用 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);
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多