Linq to NHibernate 和子对象查询

发布于 2024-11-26 18:49:18 字数 2988 浏览 2 评论 0原文

我有这个 Linq 查询:

var query = (from i in session.Query<Photo>()
                   where i.IsApproved == true
                   select i);

            if (topPhotoEnum.Equals(TimeModeEnum.Today))
                query = query.Where(x => x.UploadDate >= DateTime.Today 
                                       && x.UploadDate <= DateTime.Now);

 //return  query.OrderByDescending(x => x.Votes.Count).Take(number).ToList();

 return query.ToList()
           .OrderByDescending(x => x.Votes.Count).Take(number).ToList();

这里的问题是我从数据库检索所有数据,然后调用 OrderByDescendingTake 来过滤数据。

我更喜欢让数据库过滤数据,但似乎 Linq to NHibernate 提供程序不支持 .OrderByDescending(x => x.Votes.Count) 因为它是一个子集合操作。

Antlr.Runtime.NoViableAltException

NHibernate.Hql.Ast.ANTLR.ErrorCounter.ThrowQueryException() +100
NHibernate.Hql.Ast.ANTLR.HqlSqlTranslator.Translate() +305
NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Analyze(字符串 收藏角色)+99
NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.DoCompile(IDictionary2 替换、浅布尔值、字符串集合角色)+561
NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Compile(IDictionary
2 替换,浅布尔)+44
NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode ast、字符串查询标识符、字符串集合角色、浅布尔值、 IDictionary2 个过滤器,ISessionFactoryImplementor 工厂)+320
NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(字符串 查询标识符、IQueryExpression 查询表达式、字符串 collectionRole、浅布尔值、IDictionary
2 个过滤器、 ISessionFactoryImplementor 工厂)+66
NHibernate.Engine.Query.HQLExpressionQueryPlan.CreateTranslators(字符串 表达式Str,IQueryExpression 查询表达式,字符串 collectionRole、浅布尔值、IDictionary2enabledFilters、 ISessionFactoryImplementor工厂)+86
NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(字符串 表达式Str,IQueryExpression 查询表达式,字符串 collectionRole,浅布尔值,IDictionary
2个enabledFilters, ISessionFactoryImplementor 工厂)+63
NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(字符串 expressionStr,IQueryExpression queryExpression,浅布尔值, IDictionary2enabledFilters、ISessionFactoryImplementor 工厂)+53 NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression、浅布尔值、IDictionary2 个启用过滤器)+249
NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression 查询表达式,浅布尔值)+185
NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression 查询表达式)+158
NHibernate.Linq.NhQueryProvider.PrepareQuery(表达式表达式, IQuery&查询、NhLinqExpression& nhQuery) +82
NHibernate.Linq.NhQueryProvider.Execute(表达式表达式)+58
NHibernate.Linq.NhQueryProvider.Execute(表达式表达式)+43
Remotion.Data.Linq.QueryableBase1.GetEnumerator() +120
System.Collections.Generic.List
1..ctor(IEnumerable1 集合) +315 System.Linq.Enumerable.ToList(IEnumerable1 源) +58

有人可以帮助我吗?

I've this Linq query:

var query = (from i in session.Query<Photo>()
                   where i.IsApproved == true
                   select i);

            if (topPhotoEnum.Equals(TimeModeEnum.Today))
                query = query.Where(x => x.UploadDate >= DateTime.Today 
                                       && x.UploadDate <= DateTime.Now);

 //return  query.OrderByDescending(x => x.Votes.Count).Take(number).ToList();

 return query.ToList()
           .OrderByDescending(x => x.Votes.Count).Take(number).ToList();

the problem here is that I retrieve all data from database and then I call OrderByDescending and Take to filter data.

I'd prefer to let database filter data but seems Linq to NHibernate provider does not support .OrderByDescending(x => x.Votes.Count) because is a sub-collection operation.

Antlr.Runtime.NoViableAltException

NHibernate.Hql.Ast.ANTLR.ErrorCounter.ThrowQueryException() +100
NHibernate.Hql.Ast.ANTLR.HqlSqlTranslator.Translate() +305
NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Analyze(String
collectionRole) +99
NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.DoCompile(IDictionary2
replacements, Boolean shallow, String collectionRole) +561
NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Compile(IDictionary
2
replacements, Boolean shallow) +44
NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode
ast, String queryIdentifier, String collectionRole, Boolean shallow,
IDictionary2 filters, ISessionFactoryImplementor factory) +320
NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(String
queryIdentifier, IQueryExpression queryExpression, String
collectionRole, Boolean shallow, IDictionary
2 filters,
ISessionFactoryImplementor factory) +66
NHibernate.Engine.Query.HQLExpressionQueryPlan.CreateTranslators(String
expressionStr, IQueryExpression queryExpression, String
collectionRole, Boolean shallow, IDictionary2 enabledFilters,
ISessionFactoryImplementor factory) +86
NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String
expressionStr, IQueryExpression queryExpression, String
collectionRole, Boolean shallow, IDictionary
2 enabledFilters,
ISessionFactoryImplementor factory) +63
NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String
expressionStr, IQueryExpression queryExpression, Boolean shallow,
IDictionary2 enabledFilters, ISessionFactoryImplementor factory) +53
NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression
queryExpression, Boolean shallow, IDictionary
2 enabledFilters) +249
NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression
queryExpression, Boolean shallow) +185
NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression
queryExpression) +158
NHibernate.Linq.NhQueryProvider.PrepareQuery(Expression expression,
IQuery& query, NhLinqExpression& nhQuery) +82
NHibernate.Linq.NhQueryProvider.Execute(Expression expression) +58
NHibernate.Linq.NhQueryProvider.Execute(Expression expression) +43
Remotion.Data.Linq.QueryableBase1.GetEnumerator() +120
System.Collections.Generic.List
1..ctor(IEnumerable1 collection) +315
System.Linq.Enumerable.ToList(IEnumerable
1 source) +58

Can someone help me?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

叹倦 2024-12-03 18:49:18

这是一个已知的限制。

问题链接

关于您想要实现的目标有很多问题

此处

这里

总结一下:使用HQL、复杂子查询、sql或者使用最新的NH

it's a known limitation.

Link to Issue

there are a lot of questions around what you want to achive

here

and here

to sum up: use HQL, complex subqueries, sql or use latest NH

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文