2011-07-08 3 views
2

Est-il possible de modifier une requête (ou le mappage) de sorte que l'appel à la méthode d'extension .Fetch() de NHibernate aboutisse à une jointure interne dans la requête SQL générée?Consultation de jointure interne dans la requête Linq

En HQL c'est facile, il vous suffit d'écrire inner join fetch au lieu de left join fetch, mais je n'ai pas trouvé cela pour Linq.

Répondre

2

Puisque ce n'est pas encore possible, j'ai créé un problème pour elle Jira: NH-2790

0

Vous ne savez pas si vous pouvez contrôler le type JOIN dans LINQ, mais vous pouvez toujours avoir des requêtes fortement typées contrôlant le type JOIN à l'aide de l'API QueryOver.

var ordersWithCustomers = Session.QueryOver<Order>() 
    .JoinQueryOver(o => o.Customer,JoinType.InnerJoin) //You can specify join type 
    .List(); 

Essayez aussi ajouter not-null="true" dans votre cartographie, bien que je viens d'essayer cela et il n'a pas fait une différence le type de jointure dans la requête. Wierdly cela fonctionne pour la jointure interne (en utilisant l'ancienne syntaxe de jointure ANSI SQL) mais ne récupère pas le client.

var ordersWithCustomers = 
    from o in Session.Query<Order>() 
    join c in Session.Query<Customer>() on o.Customer.Id equals c.Id 
    select o; 
+0

Merci pour la suggestion QueryOver, au moins, ce serait plus de typesafe que HQL. J'ai aussi essayé 'not-null =" true "' et comme vous l'avez dit, cela ne change rien. – cremor

+0

Juste mis à jour avec l'exemple de syntaxe d'expression LINQ même si cela ne résout pas le problème, pourrait vous donner une autre idée. –

+0

J'ai essayé cela combiné avec 'Fetch()'. Semble fonctionner, mais produit un SQL très moche et inefficace (quelque chose comme 'Order left rejoindre OrderJoinTable left rejoindre OrderJoinTable2, Customer left rejoindre OrderJoinTable left rejoindre OrderJoinTable2 où Order.ID = Customer.ID' où OrderJoinTables proviennent de mes éléments dans l'entité). – cremor

2

MISE À JOUR 2:

https://www.nuget.org/packages/NHibernate.Linq.InnerJoinFetch

Profitez !!!

MISE À JOUR:

J'ai finalement réussi à le faire et a envoyé la demande de traction followign à l'équipe NH

https://github.com/nhibernate/nhibernate-core/pull/210


En fait, il est possible, mais vous avez besoin de pirater NHibernate , la ligne à changer est celle-ci

tree.AddFromClause(tree.TreeBuilder.LeftFetchJoin(join, tree.TreeBuilder.Alias(alias))); 

dans

tree.AddFromClause(tree.TreeBuilder.FetchJoin(join, tree.TreeBuilder.Alias(alias))); 

le fichier ProcessFetch.cs

Il semble que le comportement est pour hardcoded Linq et je pense que son parce qu'elle a utilisé les méthodes d'extension afin d'envoyer ce qu'il faut utiliser pour la DefaultQueryProvider et re-LINQ traitement, j'ai encore besoin de comprendre comment spécifier le type de jointure que vous voulez faire sur la recherche avide en utilisant l'API linq mais je travaille dessus, j'espère envoyer une demande de traction à l'équipe NH afin qu'ils puissent mettre ceci dans la base de code, pour l'instant dans mon projet, je vais utiliser ma version NH personnalisée

+0

Belle extension, mais nous utilisons le nhibernate 4 et quand je l'ajoute au projet, le nuget fixe le nhibernate à 3.3. Est-il possible de fournir une nouvelle version pour la version actuelle de nhibernate? Ou comment pourrais-je l'ajouter à mon projet? –