Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Linq to Entities und LEFT OUTER JOIN-Problem mit MANY:1-Beziehungen

Ich habe ein wenig an einem Entity Framework Provider gearbeitet und mir das angeschaut. Ich glaube, dass der Anbieter selbst in der Situation keine Wahl hat. Die Befehlsstruktur wird vom Entitätsframework erstellt und an den Anbieter zum Erstellen des SQL übergeben. Dies ist hier eine vollständige Vermutung, aber möglicherweise wird in dieser Situation der LEFT OUTER-Join generiert, weil das Entitätsframework nicht wirklich weiß, dass die referenzielle Einschränkung in der Datenbank vorhanden ist. Zum Beispiel kann ich hineingehen und mit dem Entitätsmodell herumspielen, nachdem es aus der Datenbank erstellt wurde, und Einschränkungen hinzufügen/ändern, die nicht widerspiegeln, was die Datenbank tut. Vielleicht haben sich die Designer aus diesem Grund entschieden, auf Nummer sicher zu gehen und den LEFT OUTER Join "nur für den Fall" zu produzieren.

Nichtsdestotrotz glaube ich, dass Sie eine innere Verbindung bekommen können. Folgendes hat beispielsweise dazu geführt, dass der Anbieter einen LEFT OUTER-Join erstellt hat:

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

Folgendes führt jedoch zu einem INNER Join:

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

Außerdem erzeugte die folgende Entitäts-SQL einen inneren 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" );