Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Linq to Entities e LEFT OUTER JOIN emitem relações MANY:1


Eu trabalhei um pouco em um provedor de estrutura de entidade e analisei isso. Acredito que o próprio provedor não tem escolha na situação. A árvore de comando é criada pela estrutura de entidade e a entrega ao provedor para construir o SQL. Esta é uma suposição completa aqui, mas talvez o motivo de gerar a junção LEFT OUTER nessa situação seja porque a estrutura de entidade não sabe realmente que a restrição referencial existe no banco de dados. Por exemplo, posso entrar e mexer no modelo de entidade depois que ele é criado a partir do banco de dados e adicionar/alterar restrições que não refletem o que o banco de dados está fazendo. Talvez por esta razão, os designers optaram por jogar pelo seguro e produzir a junção LEFT OUTER "apenas no caso".

No entanto, acredito que você pode obter uma junção interna. Por exemplo, o seguinte fez com que o provedor criasse uma junção LEFT OUTER:
var res2 = from a in ent.answers
           select new
           { a.Answer1, a.user.UserName };

No entanto, o seguinte resulta em uma junção INNER:
res2 = from a in ent.answers
       join u in ent.users
       on a.UserID equals u.PK
       select new { a.Answer1, u.UserName };

Além disso, a seguinte entidade SQL produziu uma junção 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" );