проблема с linq к nhibernate и нетерпеливой загрузкой в ​​приложении MVC - PullRequest
2 голосов
/ 09 ноября 2010

Здравствуйте, у меня есть следующий код для извлечения данных из моей базы данных, используя nhibernate 3.0 с linq -

public IQueryable<myEntity> getEntityWithChild
        {
            get { return _currentSession.Query<myEntity>().Fetch(c => c.myOtherEntity); }
        }

Когда я пытаюсь передать это в представление, я получаю следующую ошибку, которая неочень конкретныйЭто работало нормально, когда я не стремился загрузить, используя следующее -

public IQueryable<myEntity> getEntityWithChild
            {
                get { return _currentSession.Query<myEntity>(); }
            }

Но я создавал отдельный запрос каждый раз, когда другая сущность загружалась с отложенной загрузкой.Кто-нибудь видел это до этого, возможно, сможет указать мне в правильном направлении.Спасибо за любые мысли.

System.NotSupportedException was unhandled by user code
  Message=Specified method is not supported.
  Source=NHibernate
  StackTrace:
       at NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.GetClassName(IASTNode querySource)
       at NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.Process(IASTNode tree)
       at NHibernate.Hql.Ast.ANTLR.AstPolymorphicProcessor.Process()
       at NHibernate.Hql.Ast.ANTLR.AstPolymorphicProcessor.Process(IASTNode ast, ISessionFactoryImplementor factory)
       at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode ast, String queryIdentifier, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
       at NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(String queryIdentifier, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 filters, ISessionFactoryImplementor factory)
       at NHibernate.Engine.Query.HQLExpressionQueryPlan.CreateTranslators(String expressionStr, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
       at NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String expressionStr, IQueryExpression queryExpression, String collectionRole, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
       at NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String expressionStr, IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters, ISessionFactoryImplementor factory)
       at NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow, IDictionary`2 enabledFilters)
       at NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression queryExpression, Boolean shallow)
       at NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression queryExpression)
       at NHibernate.Linq.NhQueryProvider.PrepareQuery(Expression expression, IQuery& query, NhLinqExpression& nhQuery)
       at NHibernate.Linq.NhQueryProvider.Execute(Expression expression)
       at NHibernate.Linq.NhQueryProvider.Execute[TResult](Expression expression)
       at Remotion.Data.Linq.QueryableBase`1.GetEnumerator()
       at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
       at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
       at vCalWebCalendar.Controllers.HomeController.Hearings() in C:\Users\carl.PAMB.000\Documents\Visual Studio 2010\Projects\Calendar\Calendar\Controllers\HomeController.cs:line 41
       at lambda_method(Closure , ControllerBase , Object[] )
       at System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters)
       at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
       at System.Web.Mvc.ControllerActionInvoker.<>c__DisplayClassd.<InvokeActionMethodWithFilters>b__a()
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation)
  InnerException: 

Ответы [ 3 ]

5 голосов
/ 09 ноября 2010

Согласно сообщению в блоге Майка Хэдлоу NHibernate Linq Eager Fetching ,

Обратите внимание, что если вы хотите смешивать Fetch с другими предложениями, Fetch всегда должен стоять последним.

Является ли запрос в вашем вопросе точным запросом, который вы выполняете?

4 голосов
/ 09 ноября 2010

Похоже, ошибка или ограничение текущего поставщика LINQ. Предложение Fetch () должно быть самым последним методом в цепочке - даже после Select (). Таким образом, это вызывает вышеприведенное исключение:

_currentSession.Query<myEntity>().Fetch(c => c.myOtherEntity).Select(x => x);

тогда как это работает:

_currentSession.Query<myEntity>().Select(x => x).Fetch(c => c.myOtherEntity);

Поскольку вы возвращаете IQueryable, я подозреваю, что вы фильтруете или выбираете более высокий уровень в стеке своего приложения, что приведет к тому, что .Fetch () вызовет исключение. У Майка Хэдлоу есть больше информации об этом раздражении в его блоге здесь:

http://mikehadlow.blogspot.com/2010/08/nhibernate-linq-eager-fetching.html

0 голосов
/ 19 марта 2011

Очевидно, это исправлено в NH 3.1: https://nhibernate.jira.com/browse/NH-2502

...