使用NHibernate QueryOver的按位运算和扩展方法

时间:2013-05-30 10:34:12

标签: c# .net nhibernate extension-methods queryover

我想查询包含标志的数字列的表。

我已经针对SQL Server 2008数据库构建了NHibernate XML的映射(我只向您展示了有趣的部分):

这是我的枚举:

[Flags]
    public enum DocsFlag
    {
        FLAG_TOREAD = 0,
        FLAG_READ = 2,
        FLAG_MANAGED = 4,
        FLAG_INUSE = 8,
        FLAG_FORWARDED = 16,
        FLAG_RESUBMITTED = 32,
        FLAG_PRINTED = 64,
    }

这是我的班级:

public class MyObject
    {
      ...
      public virtual DocsFlag Flags { get; set; }
    }

这是我的类db mapping:

<class name="MyObject">
    ...
    <property name="Flags" not-null="true"/>
</class>

我想使用强类型QUERYOVER进行查询:

_session.QueryOver<MyObject>()
        .Where(x => x.Error != null & (x.Flags && (DocsFlag.FLAG_READ | DocsFlag.FLAG_MANAGED | DocsFlags.FLAG_PRINTED)> 0))
        .Left.JoinQueryOver<DestinationObj>(m => m.Destination)
        .Left.JoinQueryOver<UsersObj>(x => x.LinkedUser).ToList();

或者简单地说:

.Where (x=> x.Flags && (DocsFlag.FLAG_READ | DocsFlag.FLAG_MANAGED | DocsFlags.FLAG_PRINTED)> 0)

但它不起作用......

使用nhibernate QueryOver查询位标志的最佳方法是什么?

我尝试了这些解决方案:

  1. 我想直接使用createSqlQuery查询,但我的查询非常复杂,我想利用QueryOver API。

  2. 我已经开始使用Linq到Nhibernate的项目,但我发现了很多错误,我注意到没有完全支持查询...

  3. 编写我自己的QueryOver扩展方法来查询标记列,但这对我来说太早了,因为我不明白如何在SQL查询中QueryOver API转换代码lambda函数(并应用适当的方言)。

  4. 帮我找到最好的方法......

1 个答案:

答案 0 :(得分:2)

我也遇到了这个问题,但显然这在QueryOver中还没有用。 登录jira的问题NH-2709描述了这个错误。请参阅:https://nhibernate.jira.com/browse/NH-2709

根据Google群组“nhusers”中的discussion,您可以尝试使用HQL语法或 尝试使用LINQ提供程序(.Query&lt;&gt;)来完成此任务。

然而,在QueryOver中还有以下“怪异”的解决方法可以解决问题。是使用Projections创建一个使其工作的SQL代码片段。

替换

.Where (x=> x.Flags && (DocsFlag.FLAG_READ | DocsFlag.FLAG_MANAGED) > 0)

.Where(
    Restrictions.Gt(
        Projections.SqlProjection(String.Format("({{alias}}.Flags & {0}) as DocFlagsSet",
                                                (int)(DocsFlag.FLAG_READ | DocsFlag.FLAG_MANAGED)),
                                  null, null)
    , 0)

它创建以下SQL语句:

WHERE (this_.Flags & 6) > 0