Hi,

I have a problem with Nhibernate Linq and Fetch

I would like to do this HQL in Linq :

SELECT fp
FROM FacturationPaye fp
LEFT JOIN FETCH fp.Dossier d
LEFT JOIN FETCH d.Agence a
LEFT JOIN FETCH a.Sitegeo sg
LEFT JOIN FETCH sg.Region r
WHERE r=:region


This give me this SQL :

select *
from `sesame`.`fp_facturationpaye` facturatio0_
left outer join `sesame`.`dossier` dossier1_ on
facturatio0_.`CodeDossier`=dossier1_.`CodeDossier`
left outer join `sesame`.`agence` agence2_ on
dossier1_.`CodeEntiteGADM`=agence2_.`codeEntiteGADM`
left outer join `sesame`.`sitegeo` sitegeo3_ on
agence2_.`codeSite`=sitegeo3_.`codeSite`
left outer join `sesame`.`region` region4_ on
sitegeo3_.`codeRegion`=region4_.`codeRegion`
where region4_.`codeRegion`='ENTRE'

But when i try to do this in LINQ, with this syntax :

  var query = from fp in
NHibernateUtilPerso.QueryDAO().Linq<ADM_FacturationPayeModel.Model.FacturationPaye>()
                                .Fetch(fp => fp.Dossier).ThenFetch(a
=> a.Agence).ThenFetch(ag => ag.Sitegeo).ThenFetch(sg => sg.Region)
                   where fp.Dossier.Agence.Sitegeo.Region == region1
                   select fp ;

I get an Exception :

System.NotSupportedException: La méthode spécifiée n'est pas prise en
charge.
   à
NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.GetClassName(IASTNode
querySource) dans d:\CSharp\NH\nhibernate\src\NHibernate\Hql\Ast\ANTLR
\PolymorphicQuerySourceDetector.cs:ligne 61
   à
NHibernate.Hql.Ast.ANTLR.PolymorphicQuerySourceDetector.Process(IASTNode
tree) dans d:\CSharp\NH\nhibernate\src\NHibernate\Hql\Ast\ANTLR
\PolymorphicQuerySourceDetector.cs:ligne 27
   à NHibernate.Hql.Ast.ANTLR.AstPolymorphicProcessor.Process() dans d:
\CSharp\NH\nhibernate\src\NHibernate\Hql\Ast\ANTLR
\AstPolymorphicProcessor.cs:ligne 30
   à NHibernate.Hql.Ast.ANTLR.AstPolymorphicProcessor.Process(IASTNode
ast, ISessionFactoryImplementor factory) dans d:\CSharp\NH\nhibernate
\src\NHibernate\Hql\Ast\ANTLR\AstPolymorphicProcessor.cs:ligne 24
   à
NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(IASTNode
ast, String queryIdentifier, String collectionRole, Boolean shallow,
IDictionary`2 filters, ISessionFactoryImplementor factory) dans d:
\CSharp\NH\nhibernate\src\NHibernate\Hql\Ast\ANTLR
\ASTQueryTranslatorFactory.cs:ligne 33
   à
NHibernate.Hql.Ast.ANTLR.ASTQueryTranslatorFactory.CreateQueryTranslators(String
queryIdentifier, IQueryExpression queryExpression, String
collectionRole, Boolean shallow, IDictionary`2 filters,
ISessionFactoryImplementor factory) dans d:\CSharp\NH\nhibernate\src
\NHibernate\Hql\Ast\ANTLR\ASTQueryTranslatorFactory.cs:ligne 27
   à
NHibernate.Engine.Query.HQLExpressionQueryPlan.CreateTranslators(String
expressionStr, IQueryExpression queryExpression, String
collectionRole, Boolean shallow, IDictionary`2 enabledFilters,
ISessionFactoryImplementor factory) dans d:\CSharp\NH\nhibernate\src
\NHibernate\Engine\Query\HQLExpressionQueryPlan.cs:ligne 34
   à NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String
expressionStr, IQueryExpression queryExpression, String
collectionRole, Boolean shallow, IDictionary`2 enabledFilters,
ISessionFactoryImplementor factory) dans d:\CSharp\NH\nhibernate\src
\NHibernate\Engine\Query\HQLExpressionQueryPlan.cs:ligne 23
   à NHibernate.Engine.Query.HQLExpressionQueryPlan..ctor(String
expressionStr, IQueryExpression queryExpression, Boolean shallow,
IDictionary`2 enabledFilters, ISessionFactoryImplementor factory) dans
d:\CSharp\NH\nhibernate\src\NHibernate\Engine\Query
\HQLExpressionQueryPlan.cs:ligne 17
   à
NHibernate.Engine.Query.QueryPlanCache.GetHQLQueryPlan(IQueryExpression
queryExpression, Boolean shallow, IDictionary`2 enabledFilters) dans d:
\CSharp\NH\nhibernate\src\NHibernate\Engine\Query
\QueryPlanCache.cs:ligne 88
   à
NHibernate.Impl.AbstractSessionImpl.GetHQLQueryPlan(IQueryExpression
queryExpression, Boolean shallow) dans d:\CSharp\NH\nhibernate\src
\NHibernate\Impl\AbstractSessionImpl.cs:ligne 302
   à NHibernate.Impl.AbstractSessionImpl.CreateQuery(IQueryExpression
queryExpression) dans d:\CSharp\NH\nhibernate\src\NHibernate\Impl
\AbstractSessionImpl.cs:ligne 258
   à NHibernate.Linq.NhQueryProvider.PrepareQuery(Expression
expression, IQuery& query, NhLinqExpression& nhQuery) dans d:\CSharp\NH
\nhibernate\src\NHibernate\Linq\NhQueryProvider.cs:ligne 42
   à NHibernate.Linq.NhQueryProvider.Execute(Expression expression)
dans d:\CSharp\NH\nhibernate\src\NHibernate\Linq
\NhQueryProvider.cs:ligne 25
   à NHibernate.Linq.NhQueryProvider.Execute[TResult](Expression
expression) dans d:\CSharp\NH\nhibernate\src\NHibernate\Linq
\NhQueryProvider.cs:ligne 102
   à Remotion.Data.Linq.QueryableBase`1.GetEnumerator()
   à System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
   à System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
   à ADM_FacturationPayeIHM.App.OnStartup(StartupEventArgs e) dans C:
\CSHARP\VSDEVTF\ADM_FacturationPaye\ADM_FacturationPayeIHM
\App.xaml.cs:ligne 165

If i use this Linq :

   var query = (from fp in
NHibernateUtilPerso.QueryDAO().Linq<ADM_FacturationPayeModel.Model.FacturationPaye>()
                     where fp.Dossier.Agence.Sitegeo.Region == region1
                     select fp) ;

I have this SQL :

select *
from `sesame`.`fp_facturationpaye` facturatio0_,
`sesame`.`dossier` dossier1_,
`sesame`.`agence` agence2_,
`sesame`.`sitegeo` sitegeo3_
where facturatio0_.`CodeDossier`=dossier1_.`CodeDossier`
and dossier1_.`CodeEntiteGADM`=agence2_.`codeEntiteGADM`
and dossier1_.`CodeAgceGADM`=agence2_.`codeAgenceGADM`
and agence2_.`codeSite`=sitegeo3_.`codeSite`
and sitegeo3_.`codeRegion`='ENTRE'

This syntax use the Cartesian product, but i would like to use the
"LEFT JOIN".

How can I write this query in linq?

Thank's in advance.



-- 
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en.

Reply via email to