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进行此查询?
答案 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
查询。
这是我正在使用的当前项目中使用的解决方案;我希望它也可以帮助其他人。