2016-06-18 10 views
1

Ich habe 3 Klassen/Tabellen: Car, User und UserVote (die eine Überbrückungstabelle zwischen den anderen beiden ist).Kombinieren innere Join und linken Join in Entity Framework Abfrage

Zum Beispiel:

Car (id/name): 
1/Ford Focus 
2/Honda Civic 
3/Citroen C2 

User (id/ignoreUser): 
1/false 
2/true 
3/false 

UserVote (UserId/CarId) 
1/2 
1/3 
2/1 
3/2 

Ich habe eine Methode, die den Top-x Autos basierend auf der Anzahl der Stimmen bekommt.

Dieser Code betrachtet nur die Autos und die UserVote-Tabelle und nicht das ignoreUser-Feld auf User. Ich versuche, meinen Entity Framework-Code zu aktualisieren, um mich der Benutzertabelle anzuschließen, aber ich habe keinen Erfolg. Letztendlich suche ich nach einer Liste von Autos sortiert nach der Anzahl der UserVotes, mit Ausnahme derjenigen, die IgnoreUser auf true setzen. Im obigen Beispiel möchte ich die Methode, IQqueryable in der richtigen Reihenfolge (Honda Civic dann Citroen C2) zurückgeben.

Ich denke, ich möchte Autos nehmen und dann links mit Benutzer User verbunden mit UserVote verbinden? Ist das mit Entity Framework möglich?

Diese Frage folgt aus dem Ratschlag in einem Kommentar zu einem previous question.

Antwort

2

Wenn Sie eine User Navigationseigenschaft in Ihrem UserVote Unternehmen haben dann Abfrage könnte man auf diese Weise sein:

public IQueryable<Car> GetTopCars(int count) 
{ 
    return (from c in context.Car 
      let userVotes=car.UserVote.Where(uv=>!uv.User.IgnoreUser).Count() 
      where userVotes > 0 
      orderby userVotes 
      select c) 
      .Take(count); 
} 

Wenn Sie es tun wollen mit nur Operationen teilnehmen, dann können Sie dies tun:

public IQueryable<Car> GetTopCars(int count) 
{ 
    return (from c in context.Car 
      let userVotes=(from uv in c.UserVotes 
          join u in context.Users on uv.UserId equals u.Id into users 
          where u=>!u.IgnoreUser 
          select u).Count() 
      where userVotes > 0 
      orderby userVotes 
      select c 
      ) 
      .Take(count); 
} 
+0

Wenn ich die zweite Option mit den Join-Operationen verwende, bekomme ich doppelte Autos zurück - eins für jede Stimme. Auch ist userVotes immer gleich einem, der meiner Meinung nach auf den inneren Join zurückzuführen ist? – psych

+0

Ich werde versuchen, die zweite Variante zu beheben, Können Sie nicht die erste Lösung verwenden, ich bin mir sicher, es funktioniert. – octavioccl

+0

@psych, ich habe es behoben, aber ich schlage vor, die erste Lösung zu verwenden, wenn Sie können. IMHO ist es sauberer – octavioccl