2010-06-20 4 views
1

J'ai une table utilisateur, une table user_items, une table user_to_group et une table de groupe.Comment faire pour convet mutliple SQL gauche rejoint à Linq-To-SQL

Comment convertir la requête SQL suivante en la requête Linq-to-sql correcte?

select user.username, user.email, user_items.item_number, item_types.desc, [group].name from user 
left join user_items on user.user_id = user_items.user_id 
left join item_types on user_items.item_type_id = item_types.item_type_id 
left join user_to_group on user.user_id = user_to_group.user_id 
left join [group] on user_to_group.group_id = [group].group_id 

J'ai essayé d'utiliser le groupe et rejoint se joindre à DefaultIfEmpty, mais je suis incapable de retourner exactement les mêmes résultats que ma requête SQL.

Merci.

@ChrisF,

Bien sûr, je pouvais décomposer en:

select user.username, user.email, user_items.item_number from user 
left join user_items on user.user_id = user_items.user_id 

que j'ai en linq2sql comme:

var users = (from u in db.users 
join ui in db.user_items on u.user_id equals ui.user_id into useritems from ui in useritems.DefaultIfEmpty() 
select new { user = u, item_number = useritems == null ? string.Empty : useritems.FirstOrDefault().item_number}); 

Cependant, il ne retourne pas encore tous les résultats, il devrait, et je ne peux pas voir où je vais mal.

+0

Avez-vous essayé de casser votre SQL en plusieurs étapes et la conversion de LINQ à l'étape à la fois? Vous pourriez toujours être coincé;) mais vous auriez plus de détails à ajouter à la question et un point spécifique à poser sur. – ChrisF

+0

Bien sûr, je pouvais décomposer en: select user.username, user.email, user_items.item_number de l'utilisateur gauche rejoindre user_items sur user.user_id = user_items.user_id que j'ai en linq2sql comme: var users = (from u dans db.users rejoindre ui dans db.user_items sur u.user_id est égal à ui.user_id dans useritems de ui dans useritems.DefaultIfEmpty() select new {user = u, item_number = useritems == null? string.Empty: useritems.FirstOrDefault().numéro d'article}); Cependant, il ne retourne toujours pas tous les résultats qu'il devrait, et je ne peux pas voir où je vais mal. – Neophyte

+0

Si vous modifiez votre question avec cette information, il sera plus facile à comprendre. – ChrisF

Répondre

1

J'ai trouvé mon problème, je choisissais

useritems.FirstOrDefault().item_number 

Ce qui est ce que je choisi dans, au lieu de ce que je faisais pour mon join (et FirstOrDefault!):

ui.item_number 

donc, ma requête complète LINQ est

var users = (from u in db.users 
      join ug in db.user_to_groups on p.user_id equals pg.user_id into pgrp 
      from ug in pgrp.DefaultIfEmpty() 
      join g in db.groups on pg.group_id equals g.group_id into groups 
      from g in groups.DefaultIfEmpty() 
      join ui in db.user_items on u.user_id equals ui.user_id into useritems 
      from ui in useritems.DefaultIfEmpty()       

     select new { user = u, item_number = ui == null ? string.Empty : ui.item_number, usergroup = g == null ? string.Empty : g.name}); 

Merci pour votre aide!

1

Vous aurez besoin de voir la construction join ... into ....

Here is an example on MSDN

... Autre chose à considérer ... LINQ vous permettra de transformer votre structure de table simple dans une hiérarchie complexe. Une autre option au-delà des jointures de gauche serait des requêtes imbriquées. Peut-être quelque chose comme ça ...

var selected = from user in users 
       select new 
       { 
        user, 
        items = from item in user_items 
          where item.user_id == user.user_id 
          join it in item_types 
           on item.item_type_id equals it.item_type_id 
          select it, 
        groups = from ug in user_to_groups 
          where ug.user_id == user.user_id 
          join @group in groups 
           on ug.group_id equals @group.group_id 
          select @group.name, 
       }; 
+0

Merci, je n'ai vu ta réponse qu'après avoir posté la mienne. J'utilisais rejoindre, seulement je sélectionnais la mauvaise chose! :) – Neophyte

0

requête Vous pouvez écrire plus laconiquement si vous définissez certaines associations entre vos objets:

from u in db.Users 
from ug in u.User_To_Groups.DefaultIfEmpty() 
let g = ug.Group 
from ui in u.UserItems.DefaultIfEmpty() 
select new 
{ 
    user = u, 
    item_number = ui == null ? string.Empty : ui.item_number, 
    usergroup = g == null ? string.Empty : g.name 
}); 
Questions connexes