2010-06-18 6 views
0

Ceci est ma première question dans stackoverflow mais vraiment pas la première fois d'obtenir une solution ici. Je suis aux prises avec plusieurs frameworks d'entité jointe 4. J'ai trois tables (Accounts, Users et AccountUsers) qui sont difficiles à interroger.Requête de jointure multiple dans eSql

Ce que je veux, c'est obtenir tous les utilisateurs pour le compte accountId fourni, y compris le créateur du compte. Je peux obtenir tous les utilisateurs de compte sans problème mais le côté difficile pour moi est d'obtenir le créateur de compte car il n'est pas ajouté à la table AccountUsers. ci-dessous est un aperçu rapide de la façon dont les tables sont liées.

Comptes

  • AccountId
  • UserId (créateur de compte)
  • ... autres colonnes

Utilisateurs

  • UserId
  • ... o colonnes utres

de AccountUsers

  • accountid
  • UserId

Je préfère que la requête soit esql, mais LINQ to Entities feront. Je vous fais confiance sur stackoverflow, alors je sais que cela ne prendra pas longtemps pour obtenir la marque "Answer".

Merci d'avoir lu.

Répondre

0

Si je lis bien votre question, vous n'êtes pas à la recherche d'une adhésion autant qu'un syndicat? Je ne suis pas sûr d'esql, mais je pense que la requête Linq suivante devrait fonctionner. Peut-être qu'il va vous aider à aller dans la bonne direction (ou je pourrais être complètement hors de la base ou quelque chose qui manque):

var users = (from accountUser in db.AccountUsers 
      where accountUser.AccountId == myAccountId 
      select accountUser.UserId) 
      .ToList() 
      .Add((from account in db.Accounts 
        where account.AccountId == myAccountId 
        select account.UserId) 
       .Single()); 

Pour rendre le chargement paresseux, vous pouvez toujours faire une méthode qui utilise foreach et yield return :

IEnumerable<int> GetAccountUsers(int AccountId) 
{ 
    //return the users 
    foreach(var userId in (from accountUser in db.AccountUsers 
          where accountUser.AccountId == myAccountId 
          select accountUser.UserId)) 
     yield return userId; 

    //return the owner too 
    yield return (from account in db.Accounts 
        where account.AccountId == myAccountId 
        select account.UserId) 
       .Single(); 
} 

Par curiosité, cependant, pourquoi le propriétaire ne a également ajouté à la table AccountUsers?

+0

Peut-être que ce dont j'ai besoin est l'union, je ne suis pas sûr. Votre requête semble s'exécuter deux fois, le .ToList() et .Single(). Je veux que la requête s'exécute une fois, si l'union fait, alors je vais y aller, je ne suis pas seulement bon dans les questions. Le propriétaire n'est pas ajouté à la table AccountUsers car la table de comptes a déjà l'ID utilisateur qui indique AccountOwner. – Syma