gpt4 book ai didi

nhibernate - Linq to NHibernate - 订购匿名类型

转载 作者:行者123 更新时间:2023-12-04 01:05:17 26 4
gpt4 key购买 nike

我正在使用 Nhibernate v2.1.2.4000。由于 Posts 和 Tags 之间存在多对多关系,我有以下查询:

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

订购匿名类型失败(引用未设置到对象的实例)。这个问题与 LinqToNH 有关吗?这个错误的根源是什么?解决办法是什么?如果它与 LinqToNH 相关,那么如何使用其他选项(即 Criteria 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();
}
}

最佳答案

在 NHibernate 2.1.2.4000 的 NHibernate.Linq 中有很多东西是行不通的。您可以改用 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

关于nhibernate - Linq to NHibernate - 订购匿名类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4318401/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com