我想查询包含标志的数字列的表。
我已经针对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
查询位标志的最佳方法是什么?
我尝试了这些解决方案:
我想直接使用createSqlQuery
查询,但我的查询非常复杂,我想利用QueryOver
API。
我已经开始使用Linq到Nhibernate的项目,但我发现了很多错误,我注意到没有完全支持查询...
编写我自己的QueryOver
扩展方法来查询标记列,但这对我来说太早了,因为我不明白如何在SQL查询中QueryOver
API转换代码lambda函数(并应用适当的方言)。
帮我找到最好的方法......
答案 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