2010-11-09 3 views
2

Bonjour je le code suivant pour récupérer les données de mon db en utilisant NHibernate 3.0 avec LINQ -avec LINQ au chargement NHibernate et désireux dans l'application mvc

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

Lorsque je tente de transmettre ce à une vue, Je reçois l'erreur suivante qui n'est pas très spécifique. Cela a bien fonctionné quand je ne chargeait pas impatient à l'aide les éléments suivants -

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

Mais je créais une requête séparée à chaque fois que l'autre entité serait chargée paresseux. Quelqu'un a-t-il déjà vu cela avant de pouvoir me diriger dans la bonne direction? Merci pour vos commentaires.

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: 

Répondre

5

Selon le blog de Mike Hadlow NHibernate Linq Eager Fetching,

Notez que si vous voulez mélanger Fetch avec d'autres clauses, Fetch doit toujours venir en dernier.

est la requête dans votre question la exacte requête que vous exécutez?

+0

ouais - c'est la dernière requête. (Les noms des entités ont évidemment été changés, mais l'ordre de la requête est le même.) – czuroski

+0

Etes-vous sûr? N'oubliez pas que puisqu'il s'agit d'un IQueryable, l'exécution sera différée et tout ce que vous pourriez faire avec le Model ou la View sera traité comme faisant partie de la requête originale. Un moyen rapide de tester serait de faire que la méthode 'getEntityWithChild' renvoie' IEnumerable '. –

+0

cela fonctionne si je change la méthode pour retourner IEnumerable. Je faisais un filtre dans mon contrôleur. Je n'avais pas réalisé qu'en utilisant IQueryable, tout ce que je faisais dans le contrôleur affectait la requête originale. J'ai enlevé mon filtre du contrôleur et juste utilisé la requête originale et cela a fonctionné parfaitement. Je vous remercie. – czuroski

4

Ressemble à un bogue ou à une limitation du fournisseur LINQ actuel. La clause Fetch() doit être la toute dernière méthode de la chaîne, même après Select(). Donc, ce produit l'exception ci-dessus:

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

alors que cela fonctionne:

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

Puisque vous retourner un IQueryable, je soupçonne que vous le filtrage ou la sélection plus haut dans la pile d'applications, qui provoquerait le .Fetch() pour lancer une exception. Mike Hadlow a plus d'informations sur ce désagrément sur son blog ici:

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

+0

ce que heppand si vous devez sélectionner y. mais vous voulez toujours chercher une propriété de x? _currentSession.Query () .Sélectionnez (x => y) .Fetch (?????); – ari

Questions connexes