Mysql
 sql >> Base de données >  >> RDS >> Mysql

Problème Linq to Entities et LEFT OUTER JOIN avec MANY:1 relations

J'ai travaillé un peu sur un fournisseur de framework d'entité et j'ai examiné cela. Je crois que le fournisseur lui-même n'a pas le choix dans la situation. L'arborescence de commandes est créée par le framework d'entité et la donne au fournisseur pour construire le SQL. Il s'agit d'une supposition complète ici, mais peut-être que la raison pour laquelle il génère la jointure LEFT OUTER dans cette situation est que le framework d'entité ne sait pas vraiment que la contrainte référentielle existe dans la base de données. Par exemple, je peux entrer et jouer avec le modèle d'entité après sa création à partir de la base de données et ajouter/modifier des contraintes qui n'ont aucune réflexion sur ce que fait la base de données. C'est peut-être pour cette raison que les concepteurs ont choisi de jouer la sécurité et de produire la jointure LEFT OUTER "juste au cas où".

Néanmoins, je crois que vous pouvez obtenir une jointure interne. Par exemple, les éléments suivants ont amené le fournisseur à créer une jointure LEFT OUTER :

var res2 = from a in ent.answers
           select new
           { a.Answer1, a.user.UserName };

Cependant, les résultats suivants dans une jointure INNER :

res2 = from a in ent.answers
       join u in ent.users
       on a.UserID equals u.PK
       select new { a.Answer1, u.UserName };

En outre, l'entité SQL suivante a produit une jointure interne :

ObjectQuery<DbDataRecord> dr = ent.CreateQuery<DbDataRecord>( 
         "SELECT a.answer1, u.username " +
         "FROM answers as a inner join users as u on a.userid = u.pk" );