Linq到NHibernate-排序匿名类型

Linq到NHibernate-排序匿名类型,nhibernate,linq-to-nhibernate,Nhibernate,Linq To Nhibernate,我使用的是Nhibernate v2.1.2.4000。由于帖子和标签之间存在多对多关系,我有一个疑问: tags .Select(t => new { Name = t.Name, Count = t.Posts.Count }) .OrderBy(x => x.Count); 排序匿名类型失败(引用未设置为对象的实例)。这个问题与林克顿有关吗?这个错误的来源是什么?解决办法是什么? 如果它与LinqToNH有关,那么如何使用其他选项(即标准API)解决它 编辑:当我尝试Adam

我使用的是Nhibernate v2.1.2.4000。由于帖子和标签之间存在多对多关系,我有一个疑问:

tags
.Select(t => new { Name = t.Name, Count = t.Posts.Count })
.OrderBy(x => x.Count);
排序匿名类型失败(引用未设置为对象的实例)。这个问题与林克顿有关吗?这个错误的来源是什么?解决办法是什么? 如果它与LinqToNH有关,那么如何使用其他选项(即标准API)解决它

编辑:当我尝试Adam的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();
    }
}
公共类标记映射:类映射
{
公共标记映射()
{
表(“标签”);
Id(x=>x.Id).GeneratedBy.GuidComb();
Map(x=>x.Name);
HasManyToMany(x=>x.Posts)
.表格(“PostTags”)
.ChildKeyColumn(“Post”)
.ParentKeyColumn(“标记”)
.Cascade.None().Inverse();
}
}

NHibernate.Linq for NHibernate 2.1.2.4000中有很多东西根本不起作用。您可以改为使用HQL或ICriteria,或者升级到NHibernate 3.0,或者如果您要使用所有数据,则通过添加
ToList
来强制Linq查询在
Select
之后执行

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

尝试先订购,然后选择。我在2.1.2.4上有非常相似的查询,它们工作得非常好


编辑:也可以尝试在
Count
Count()之间切换。谢谢您的回答。不幸的是,目前无法升级到3.0。如何使用标准API编写它?此外,我还编辑了Criteria API选项的问题。Adam,当我在resultset中尝试此ICriteria版本时,计数始终为1,尽管并非所有计数都为1。你知道为什么会发生这种情况吗?你能定义一对多关系而不是多对多关系吗?您有权访问SQL Server探查器吗?试着运行它,看看你从调用中得到了什么。我构建了一个演示应用程序来测试我的iCiteria,但我在这里没有访问权限。我编辑了问题,添加了执行的脚本和标记的映射。非常感谢。它正在工作。还有一个问题Adam:我如何更改您的条件,使其生成外部联接,而不是内部联接。