2010-11-30 78 views
3

我使用的是Nhibernate v2.1.2.4000。随着标签帖子之间的许多一对多的关系,我有查询:Linq to NHibernate - 订购匿名类型

tags 
.Select(t => new { Name = t.Name, Count = t.Posts.Count }) 
.OrderBy(x => x.Count); 

订购匿名类型失败(引用不设置到对象的实例)。这个问题与LinqToNH有关吗?什么可能是这个错误的来源?解决办法是什么? 如果它与LinqToNH有关,那么如何用其他选项(即Criteria API)解决它?

编辑:当我尝试亚当的ICriteria选项,SqlProfiler说执行的脚本是:

SELECT this_.Name as y0_, count(this_.Id) as y1_ FROM Tag this_ GROUP BY this_.Name ORDER BY count(this_.Id) asc 

的映射标签:

public class TagMap : ClassMap<Tag> 
{ 
    public TagMap() 
    { 
     Table("Tag"); 
     Id(x => x.Id).GeneratedBy.GuidComb(); 
     Map(x => x.Name); 
     HasManyToMany(x => x.Posts) 
      .Table("PostTags") 
      .ChildKeyColumn("Post") 
      .ParentKeyColumn("Tag") 
      .Cascade.None().Inverse(); 
    } 
} 

回答

2

有在NHibernate.Linq许多事情的NHibernate 2.1.2.4000那是行不通的。您可以使用HQL或ICriteria,或者升级到NHibernate 3.0,或者如果您要使用所有数据,请在Select之后通过添加ToList强制执行您的Linq查询。

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,拱门。我之前的地图是错误的。然而,这似乎工作。

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 
+0

切换。不幸的是,升级到3.0不是目前的选择。如何使用Criteria API编写它?我也编辑了Criteria API选项的问题。 – rovsen 2010-12-01 21:02:44

+0

亚当,当我尝试结果集计数ICriteria版本总是1,虽然不是所有他们都是1.你知道为什么会发生这种情况吗? – rovsen 2010-12-02 21:57:53

1

尝试订货,然后再进行选择。我在2.1.2.4上有非常类似的查询,可以很好地工作。

编辑:也尝试感谢您的回答CountCount()之间