2009-04-16 12 views
1

Ich habe eine Menge Zeit damit verbracht, diese Abfrage richtig zu machen, also hoffe ich, dass StackOverflow mir in die richtige Richtung zeigen kann.Multi-Tabelle LinqToSql Aggregat Funktion

ich drei Tabellen haben:

  • Territorien (TerritoryID, TerritoryName usw.)
  • UserTerritories (Just a gerrund)
  • Benutzer (Benutzer-ID, Username, StatusID)

I müssen alle Gebiete mit einem oder mehreren Benutzern mit einer StatusId von (sagen wir mal) 3.

Alles, was ich wirklich kompilieren konnte, ist die Verknüpfung aller Tabellen :(

IEnumerable<Territory> territories = (from t in db.Territories 
             join uXt in db.User_x_Territories on t.TerritoryId equals uXt.UserID into tJoin 
             from uXt in tJoin.DefaultIfEmpty() 
             join u in db.Users on uXt.UserID equals u.Id into uJoin 
             from u in uJoin.DefaultIfEmpty() 
             select t); 

Kann mir jemand helfen? Alles, was ich online finden konnte, sind ziemlich einfache Beispiele.

Antwort

4
var territories = context.Territories 
    .Where(t=> t.UserTerritories.Any(ut=>ut.User.StatusId == 3)); 
dieses Geben

Es funktioniert wie es liest :)

bekommt nur die Gebiete, die den gewünschten Zustand entsprechen, die mit dem Status jeden Benutzer zu haben ist ID 3. Die Verwendung der Beziehungen vereinfacht viele der Abfragen.

Update: wenn man so will es das gleiche mit der Abfragesyntax

var territories = from t in context.Territories 
        where t.UserTerritories.Any(ut=>ut.User.StatusId == 3)) 
        select t; 
+0

Wird Ihnen das nicht ein kartesisches Produkt geben, wenn Sie mehr als einen qualifizierten Benutzer mit demselben Gebiet haben? –

+0

@Adam Ich aktualisierte es, um mehr Sinn zu machen, aber der Geist bleibt: überprüfen Sie einfach die Beziehungen, wenn es einen Benutzer über die Beziehungen, die eine 3 als Status-ID hat :) – eglasius

+0

+1 für besser lesbar als meine;) –

2

ein Schuss ...

(from u in users where u.StatusId==3 
    join ut in userTerritories on u.UserId equals ut.UserId 
    join t in territories on ut.TerritoryId equals t.TerritoryId 
    group t by t into gg select gg.Key) 
+0

Ihre Antwort als gut funktioniert, aber die andere Antwort war mehr CONSCISE und (überraschend) schneller. –

+0

Einverstanden; Wenn der andere auch funktioniert, ist es besser lesbar. –

+0

+1 da das war eine gute Antwort auch :) – eglasius