2009-04-16 7 views
1

J'ai eu beaucoup de mal à obtenir cette requête, donc j'espère que StackOverflow pourra me diriger dans la bonne direction.Multi-Table LinqToSql Aggregate Fonction

J'ai trois tables:

  • Territoires (TerritoryID, TerritoryName, etc.)
  • UserTerritories (Juste un gerrund)
  • Utilisateurs (UserId, UserName, StatusID)

I besoin d'obtenir tous les territoires qui ont un ou plusieurs utilisateurs avec un ID de statut de (disons) 3.

Tout ce que j'ai vraiment été en mesure d'obtenir de compiler est reliant toutes les tables :(

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); 

Quelqu'un peut-il me aider? Tout ce que j'ai pu trouver en ligne sont des exemples assez simples.

Répondre

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

Il fonctionne comme il se lit comme suit :)

obtient juste les territoires qui correspondent à la condition souhaitée, ce qui est d'avoir un utilisateur avec le statut id 3. L'utilisation des relations simplifie beaucoup de requêtes.

Mise à jour: si vous l'aimez plus la même chose avec la syntaxe de requête

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

Cela ne vous donnera-t-il pas un produit cartésien si vous avez plus d'un utilisateur admissible ayant le même territoire? –

+0

@Adam je l'ai mis à jour pour faire plus de sens, mais l'esprit reste: il suffit de vérifier les relations s'il y a un utilisateur à travers les relations qui a un 3 comme l'ID d'état :) – eglasius

+0

+1 pour plus lisible que le mien;) –

2

Donnez un coup ... ce

(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

Votre réponse a travaillé aussi bien, mais l'autre réponse était plus CONSCISE et plus rapide (étonnamment). –

+0

D'accord; si l'autre a fonctionné aussi, alors c'est plus lisible. –

+0

+1 puisque c'était aussi une bonne réponse :) – eglasius