Linq to NHibernate 和子对象查询
我有这个 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();
这里的问题是我从数据库检索所有数据,然后调用 OrderByDescending
和 Take
来过滤数据。
我更喜欢让数据库过滤数据,但似乎 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
2 替换,浅布尔)+44
NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Compile(IDictionary
NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode ast、字符串查询标识符、字符串集合角色、浅布尔值、 IDictionary2 个过滤器,ISessionFactoryImplementor 工厂)+320
2 个过滤器、 ISessionFactoryImplementor 工厂)+66
NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(字符串 查询标识符、IQueryExpression 查询表达式、字符串 collectionRole、浅布尔值、IDictionary
NHibernate.Engine.Query.HQLExpressionQueryPlan.CreateTranslators(字符串 表达式Str,IQueryExpression 查询表达式,字符串 collectionRole、浅布尔值、IDictionary2enabledFilters、 ISessionFactoryImplementor工厂)+86
2个enabledFilters, ISessionFactoryImplementor 工厂)+63
NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(字符串 表达式Str,IQueryExpression 查询表达式,字符串 collectionRole,浅布尔值,IDictionary
NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(字符串 expressionStr,IQueryExpression queryExpression,浅布尔值, IDictionary2enabledFilters、ISessionFactoryImplementor 工厂)+53 NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression、浅布尔值、IDictionary
2 个启用过滤器)+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
1..ctor(IEnumerable
System.Collections.Generic.List1 集合) +315 System.Linq.Enumerable.ToList(IEnumerable
1 源) +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
2
replacements, Boolean shallow, String collectionRole) +561
NHibernate.Hql.Ast.ANTLR.QueryTranslatorImpl.Compile(IDictionary
replacements, Boolean shallow) +44
NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode
ast, String queryIdentifier, String collectionRole, Boolean shallow,
IDictionary2 filters, ISessionFactoryImplementor factory) +320
2 filters,
NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(String
queryIdentifier, IQueryExpression queryExpression, String
collectionRole, Boolean shallow, IDictionary
ISessionFactoryImplementor factory) +66
NHibernate.Engine.Query.HQLExpressionQueryPlan.CreateTranslators(String
expressionStr, IQueryExpression queryExpression, String
collectionRole, Boolean shallow, IDictionary2 enabledFilters,
2 enabledFilters,
ISessionFactoryImplementor factory) +86
NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String
expressionStr, IQueryExpression queryExpression, String
collectionRole, Boolean shallow, IDictionary
ISessionFactoryImplementor factory) +63
NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String
expressionStr, IQueryExpression queryExpression, Boolean shallow,
IDictionary2 enabledFilters, ISessionFactoryImplementor factory) +53
2 enabledFilters) +249
NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression
queryExpression, Boolean shallow, IDictionary
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
1..ctor(IEnumerable
System.Collections.Generic.List1 collection) +315
1 source) +58
System.Linq.Enumerable.ToList(IEnumerable
Can someone help me?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
这是一个已知的限制。
问题链接
关于您想要实现的目标有很多问题
此处
这里
总结一下:使用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