Linq to NHibernate и запрос подчиненного объекта - PullRequest
0 голосов
/ 29 июля 2011

У меня есть этот запрос 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 для провайдера 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.) + 99
NHibernate.Hql., String collectionRole, Boolean shallow, фильтры IDictionary 2 filters, ISessionFactoryImplementor factory) +320<br> NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(String queryIdentifier, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary 2, фабрика ISessionFactoryImplementor) + 66
NHibernate.Engine.Query.HQLExpressionQueryPlan.CreateTranslators (String expressionStr, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary 2 enabledFilters, ISessionFactoryImplementor factory) +86<br> NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String expressionStr, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary 2 enabledFilters, фабрика ISessionFactoryImplementor) + 63
NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor (запрос на выражение строки String expressionStr, запрос на выражение логики, строковое выражение String2 enabledFilters, ISessionFactoryImplementor factory) +53 NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary 2 enabledFilters) + 249
NHibernate.NhQueryProvider.PrepareQuery (Выражение выражения, IQuery & query, NhLinqExpression & nhQuery) + 82
NHibernate.Linq.NhQueryProvider.Execute (выражение выражения) + 58
NHibernate.Linq.NhQueryProvideRemotion.Data.Linq.QueryableBase 1.GetEnumerator() +120<br> System.Collections.Generic.List 1..ctor (IEnumerable 1 collection) +315 System.Linq.Enumerable.ToList(IEnumerable 1 source) + 58

Может кто-нибудь мне помочь?

1 Ответ

1 голос
/ 29 июля 2011

это известное ограничение.

Ссылка на выпуск

Есть много вопросов относительно того, что вы хотите достичь

здесь

и здесь

для суммирования: используйте HQL, сложные подзапросы, sql или используйте последний NH

...