2011-03-22 4 views
4

Peut-être une question assez facile mais je suis nouveau dans Linq to SQL. J'ai deux tablesJoindre deux tables dans Linq à SQL

User : UserId,name,Password,Email 
USER_TABLE: Id, UserId, FirstName,LastName...... 

Je voudrais une requête qui donne par exemple: userID=3 puis donner tous les détails (FirstName,LastName etc) Comment puis-je joindre ces deux tableaux? Je préférerais le code C# si c'est possible!

Répondre

6

Vous ne devez pas faire tout vous-même la plomberie. Si vous avez les bonnes clés étrangères dans la base de données, vous n'aurez pas à vous joindre à vous.

Vous pouvez juste faire:

var query = from u in db.Users 
select new { User = u; 
FirstName = u.UserTables.FirstName } 
+1

Si vous suivez cette route, assurez-vous que vous avez la plomberie que vous voulez en place - sinon vous pouvez trouver que pour une liste de 100 utilisateurs, vous pourriez finir par faire 101 requêtes - 1 pour la liste des utilisateurs et 100 pour chaque Prénom à son tour. – Stuart

+0

@Stuart: vous voulez dire chargement différé mais non, ce n'est pas vrai. Si vous utilisez un select {} comme celui-ci, il fera exactement une jointure. Cependant, si vous voulez faire un foreach sur User et ensuite référencer dans le foreach les UserTables vous obtiendrez le chargement différé (1 + 100). Cependant, cela peut être contrôlé en utilisant LoadOptions – Pleun

+0

Oui - d'accord - J'ai pris soin de dire "pourrait" et de dire que vous pourriez éviter via "plomberie" - mais j'aurais pu être plus clair et plus explicite - désolé. – Stuart

2

Comme cela peut-être:

var joinedResult = from u in context.User 
        join u2 in context.UserTable on u.UserId equals u2.UserId 
        select new { 
         UserId = u.UserId, 
         FirstName = u2.FirstName 
        }; 

je suppose que votre exemple est juste un exemple , non? Parce que cela n'a pas beaucoup de sens de diviser ces données en deux tables.

+0

sur votre commentaire sur le partage des données comme celui-ci , Je suis tout à fait d'accord - mais je pense aussi que c'est en fait assez commun - en particulier dans le code d'adhésion ASP.Net. – Stuart

+0

Et nous savons tous * que c'est * un bon exemple de génie logiciel :) –

4

pour une jointure utiliser quelque chose comme:

var query = from u in db.Users 
      join ut in db.UserTables on u.UserId equals ut.UserId 
      select new 
      { 
       User = u, 
       Extra = ut 
      }; 
+1

Je ne veux pas utiliser l'UserId comme une clé étrangère dans le USER_TABLE. Donc je dois utiliser ce chemin que vous me proposez? – dali1985

+0

Si vous ne le voulez pas comme un FK (ce qui est assez inhabituel!) Alors vous pouvez simplement utiliser un 'de ut dans db.UserTables où u.Userid == ut.Userid' à la place. – Stuart

1

Il est possible de joindre des tables en utilisant LINQ:

Par exemple:

var test = (from a in DataContext.User 
    join b in DataContext.UserTable on a.UserId equals b.UserId 
    select new 
    {      
     UserId = a.UserId, 
     FirstName = b.FirstName 
     LastName = b.LastName 
    }).ToList(); 

Cordialement