gpt4 book ai didi

c# - Nhibernate Linq - 选择评分最高的项目

转载 作者:行者123 更新时间:2023-11-30 12:09:38 25 4
gpt4 key购买 nike

也许这个问题涵盖了现有的问题,但我仍然找不到解决方案。

我有 2 个表 A 和 B。B 有评级 - 这是非常基本的评级,所以它只保留对用户的引用和对表 A 中项目的引用。我想从表 A 中选择评分最高的项目。

所以我尝试了这个:

var innerQuery = from csr in session.Query<Rating>()
group csr by csr.ItemId into scrg
orderby scrg.Count() descending
select scrg.Key;

var result = from cs in session.Query<Item>() where innerQuery.Contains(cs.Id) select cs;

return result.Take(maxToReturn).ToList<Item>();

返回对我来说很重要List<Item>

但我有一个异常(exception):

Action: Index Exception: System.NotImplementedException: Cannot use group by with the ContainsResultOperator result operator.
at NHibernate.Linq.GroupBy.AggregatingGroupByRewriter.FlattenSubQuery(QueryModel queryModel, QueryModel subQueryModel)
at NHibernate.Linq.GroupBy.AggregatingGroupByRewriter.ReWrite(QueryModel queryModel)
at NHibernate.Linq.Visitors.QueryModelVisitor.GenerateHqlQuery(QueryModel queryModel, VisitorParameters parameters, Boolean root)
at NHibernate.Linq.Visitors.HqlGeneratorExpressionTreeVisitor.VisitSubQueryExpression(SubQueryExpression expression)
at ............

有什么想法吗?

更新:

我的 Item 类与评级完全无关,我只是在显示项目时计算它,因为它可以被任何人评级(因此应该经常更新),但我可以添加关系是否有帮助?

谢谢大家,

最佳答案

错误信息其实很清楚。众所周知,很长一段时间以来,Linq to Nhibernate 提供程序都有一些局限性。这似乎是这些限制之一。

这意味着您不能为此使用 .Query

或者,正如评论中已经提到的那样,通过调用 ToList 将内部查询存入内存,这应该可行,尽管它可能比只运行一个查询慢。

 var innerQuery = (from csr in session.Query<Rating>()
group csr by csr.ItemId into scrg
orderby scrg.Count() descending
select scrg.Key).ToList();

或者您可以尝试让它与 nhibernate 提供的其他查询技术之一一起使用。 criteria API 实际上似乎在包含分组的 where 子句中支持这种子查询。有a look here举个例子。

关于c# - Nhibernate Linq - 选择评分最高的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20960213/

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