sql >> Base de Datos >  >> RDS >> Mysql

Problema de Linq to Entities y LEFT OUTER JOIN con relaciones MUCHAS:1

He trabajado un poco en un proveedor de marco de entidad y lo he analizado. Creo que el propio proveedor no tiene elección en la situación. El árbol de comandos lo crea el marco de la entidad y se lo entrega al proveedor para que construya el SQL. Esta es una suposición completa aquí, pero tal vez la razón por la que genera la unión EXTERNA IZQUIERDA en esa situación es porque el marco de la entidad realmente no sabe que la restricción referencial existe en la base de datos. Por ejemplo, puedo entrar y modificar el modelo de entidad después de que se haya creado a partir de la base de datos y agregar/cambiar restricciones que no reflejan lo que está haciendo la base de datos. Tal vez por esta razón, los diseñadores decidieron ir a lo seguro y producir la unión EXTERNA IZQUIERDA "por si acaso".

No obstante, creo que puedes obtener una unión interna. Por ejemplo, lo siguiente provocó que el proveedor creara una unión EXTERNA IZQUIERDA:

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

Sin embargo, lo siguiente da como resultado una combinación INNER:

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

Además, la siguiente entidad SQL produjo una unión interna:

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" );