Ho lavorato un po' su un provider di framework di entità e l'ho esaminato. Credo che il fornitore stesso non abbia scelta nella situazione. L'albero dei comandi viene creato dal framework dell'entità e lo fornisce al provider per creare l'SQL. Questa è un'ipotesi completa qui, ma forse il motivo per cui genera il join LEFT OUTER in quella situazione è perché il framework dell'entità non sa veramente che il vincolo referenziale esiste nel database. Ad esempio, posso entrare e modificare il modello di entità dopo che è stato creato dal database e aggiungere/modificare vincoli che non hanno alcun riflesso su ciò che il database sta facendo. Forse per questo motivo, i designer hanno scelto di andare sul sicuro e di produrre il raccordo LEFT OUTER "per ogni evenienza".
Tuttavia, credo che tu possa ottenere un'unione interiore. Ad esempio, quanto segue ha fatto sì che il provider creasse un join LEFT OUTER:
var res2 = from a in ent.answers
select new
{ a.Answer1, a.user.UserName };
Tuttavia, i seguenti risultati in un join INNER:
res2 = from a in ent.answers
join u in ent.users
on a.UserID equals u.PK
select new { a.Answer1, u.UserName };
Inoltre, la seguente entità SQL ha prodotto un inner join:
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" );