3

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

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

这是我的枚举:

[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; }
    }

这是我的类数据库映射:

<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但我的查询非常复杂,我想利用QueryOverAPI。

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

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

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

4

2 回答 2

3

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

根据谷歌组“nhusers”中的讨论,您可以尝试 HQL 语法或尝试使用 LINQ 提供程序 (.Query<>) 来完成此操作。

但是,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
于 2013-08-02T11:52:15.700 回答
0

也许为时已晚,但是 linq 有一些方法

.Where(x => (x.Enum & Permission.Read) == Permission.Read)
于 2021-12-08T08:51:33.147 回答