NHibernate查询是否有子句

NHibernate查询是否有子句,nhibernate,queryover,Nhibernate,Queryover,我想使用QueryOver编写这样一个查询,以便结果SQL类似于以下内容: Select Bar, count(*) from Foo group by Bar having count(*) > 1 我怎么做呢?我想你应该用Where方法 Session.QueryOver<Foo>() .Select(Projections.GroupProperty(Projections.Property<Foo>(foo => foo.Bar)),

我想使用QueryOver编写这样一个查询,以便结果SQL类似于以下内容:

Select Bar, count(*) from Foo group by Bar having count(*) > 1

我怎么做呢?

我想你应该用Where方法

Session.QueryOver<Foo>()
    .Select(Projections.GroupProperty(Projections.Property<Foo>(foo => foo.Bar)),
            Projections.Count<Foo>(f => f.Id))
    .Where(Restrictions.Gt(Projections.Count<Foo>(f => f.Id), 1));
Session.QueryOver()
.Select(Projections.GroupProperty(Projections.Property(foo=>foo.Bar)),
投影。计数(f=>f.Id))
式中(限制.Gt(投影.计数(f=>f.Id),1));

Vadim的回答是正确的,只是想指出,如果需要根据另一个数据库字段检查“having”条件,这可能是一个挑战

例如,以下SQL:

select Foo.Bar, COUNT(*) from Foo
group by Foo.Bar
having Foo.Bar <> COUNT(*)
从Foo中选择Foo.Bar、COUNT(*)
按Foo.Bar分组
有食物棒计数(*)
基本上应该使用QueryOver创建,如下所示:

Session.QueryOver<Foo>()
    .Select(Projections.GroupProperty(Projections.Property<Foo>(foo => foo.Bar)),
            Projections.Count<Foo>(f => f.Id))
    .Where(Restrictions.NotEqProperty(Projections.Count<Foo>(f => f.Id), Projections.Property<Foo>(foo => foo.Bar)));
Session.QueryOver()
.Select(Projections.GroupProperty(Projections.Property(foo=>foo.Bar)),
投影。计数(f=>f.Id))
.Where(Restrictions.NotEqProperty(Projections.Count(f=>f.Id)、Projections.Property(foo=>foo.Bar));
但不幸的是,NHibernate生成以下无效的SQL(使用where而不是have):

从Foo中选择Foo.Bar、COUNT(*)
按Foo.Bar分组
其中Foo.Bar计数(*)
为了克服这个问题,我必须创建以下继承:

    public class NonEqPropertyExpression : EqPropertyExpression
    {
        public NonEqPropertyExpression(IProjection lhsProjection, IProjection rhsProjection)
            : base(lhsProjection, rhsProjection)
        {
        }

        protected override string Op
        {
            get { return "<>"; }
        }
    }
公共类NonEqPropertyExpression:EqPropertyExpression
{
公共非物业表达(I项目LH项目、I项目RH项目)
:基础(左投影、右投影)
{
}
受保护重写字符串操作
{
获取{return”“;}
}
}
并使用我的新类而不是标准的非属性:

Session.QueryOver<Foo>()
    .Select(Projections.GroupProperty(Projections.Property<Foo>(foo => foo.Bar)),
            Projections.Count<Foo>(f => f.Id))
    .Where(new NonEqPropertyExpression(Projections.Count<Foo>(f => f.Id), Projections.Property<Foo>(foo => foo.Bar)));
Session.QueryOver()
.Select(Projections.GroupProperty(Projections.Property(foo=>foo.Bar)),
投影。计数(f=>f.Id))
.Where(新的NonEqPropertyExpression(Projections.Count(f=>f.Id),Projections.Property(foo=>foo.Bar));

在这种情况下,生成的SQL是正确的。

应该是
Projections.GroupProperty(Projections.Property(foo=>foo.Bar))
如果我们使用Projections.Sum(),这里有什么区别?我有一个类似的问题。不是从另一个数据库获取,而是标准出现在where中而不是have中。你能看一看吗
Session.QueryOver<Foo>()
    .Select(Projections.GroupProperty(Projections.Property<Foo>(foo => foo.Bar)),
            Projections.Count<Foo>(f => f.Id))
    .Where(new NonEqPropertyExpression(Projections.Count<Foo>(f => f.Id), Projections.Property<Foo>(foo => foo.Bar)));