Nhibernate - 如何使用QueryOver获得有序的不同结果?

时间:2010-07-28 07:02:32

标签: nhibernate

public class City
{
    virtual public long Id { get; set; }
    virtual public string Name { get; set; }
}

城市表包含重复的名称,我想删除重复项。我也想通过Id订购结果。

首先我考虑了以下问题。

select distinct Name from City order by Id;

但是,如果指定了SELECT DISTINCT,那么“ORDER BY项目必须出现在选择列表中”。例外。看到http://weblogs.sqlteam.com/jeffs/archive/2007/12/13/select-distinct-order-by-error.aspx后,我想我应该这样做:

select Name from City group by Name order by min(Id)

所以我的问题是如何使用QueryOver进行此查询?

2 个答案:

答案 0 :(得分:5)

这在ICriteria中是可能的:

var list =
    session.CreateCriteria<City>()
        .SetProjection(Projections.Group("Name"))
        .AddOrder(Order.Asc(Projections.Min("Id")))
        .List<string>();

但是在QueryOver中目前不可能,因为缺少.OrderBy(IProjection)重载。一旦添加了缺失的重载,它应该看起来像:

var list =
    s.QueryOver<City>()
        .Select(Projections.Group<City>(p => p.Name))
        .OrderBy(Projections.Min<City>(c => c.Id)).Asc
        .List<string>();

请注意,Projections重载现在就在那里,因此您可以在ICriteria中编写以下(类型安全)查询:

var list =
    session.CreateCriteria<City>()
        .SetProjection(Projections.Group<City>(c => c.Name))
        .AddOrder(Order.Asc(Projections.Min<City>(c => c.Id)))
        .List<string>();

答案 1 :(得分:0)

所以,我发现的很简单......

var query = session.QueryOver<MyModel>()
            // Conditions here
            .OrderBy(m => m.GetThisDistinctField).Desc()  // ...or Asc()...
            .SelectList(m => m.SelectGroup(g => g.GetThisDistinctField));

var result = query.List<FieldDataType>().ToList();
return result;

要在queryover中获取有序查询,请从包含所需条件的查询开始,然后添加SelectList / SelectGroup设置以获取不同的列表。换句话说,它有点像NHibernate可以进行常规查询,然后做一些特殊的事情来使它成为select distinct查询。

这是我正在使用的当前项目中使用的解决方案;我希望它也可以帮助其他人。