В NHibernate есть много вещей, которые можно использовать в NHibernate 2.1.2.4000, но они просто не будут работать.Вместо этого вы могли бы использовать HQL или ICriteria, или обновить до NHibernate 3.0, или, если вы собираетесь использовать все данные, принудительно выполнить запрос Linq после Select
, добавив ToList
.
tags
.Select(t = new { t.Name, t.Posts.Count })
.ToList()
.OrderBy(x => x.Count);
Сам по себе анонимный объект - это то, что NHibernate.Linq может определенно обработать.
Кстати, вам не нужно указывать имя поля в анонимном объекте, если оно совпадает с полем /свойство, из которого вы его перетаскиваете.
РЕДАКТИРОВАТЬ: версия этого запроса ICriteria будет выглядеть следующим образом ...
var tags = session.CreateCriteria(typeof(Tag), "tag")
.SetProjection(
Projections.GroupProperty("tag.Name"),
Projections.Count("tag.Posts"))
.AddOrder(Order.Asc(Projections.Count("tag.Posts")))
.List();
РЕДАКТИРОВАТЬ: при правильном отображении я получаю то жеSQL, Arch.Мое раннее отображение было неверным.Однако, похоже, что этот работает.
var tags = session.CreateCriteria(typeof(Tag), "tag")
.CreateCriteria("tag.Posts", "post")
.SetProjection(
Projections.GroupProperty("tag.Name"),
Projections.Count("post.Id"))
.AddOrder(Order.Asc(Projections.Count("post.Id")))
.List();
SQL, который я получаю, это ...
SELECT this_.Name as y0_, count(post1_.Id) as y1_ FROM Tag this_ inner join Post_Tags posts3_ on this_.Id=posts3_.Tag inner join Post post1_ on posts3_.Post=post1_.Id GROUP BY this_.Name ORDER BY count(post1_.Id) asc