2010-06-20 2 views
1

У меня есть таблица пользователей, таблица user_items, таблица user_to_group и таблица групп.Как сопоставить множественные SQL-левые соединения с Linq-To-SQL

Как бы преобразовать следующий SQL-запрос в правильный запрос Linq-to-sql?

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 

Я попытался с помощью группы соединений и объединения с DefaultIfEmpty, но я не в состоянии вернуть те же результаты, как мой SQL запрос.

спасибо.

@ ChrisF,

Конечно, я мог бы разбить его на:

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

Что я имею в Linq2SQL как:

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

Однако, это еще не все вернуть результаты должны быть, и я не вижу, где я ошибаюсь.

+0

Вы пробовали ломать свой SQL на несколько шагов, и преобразования в LINQ на шаг в то время? Вы все еще можете застрять;), но у вас будет больше деталей, чтобы добавить к вопросу и конкретный вопрос, о котором нужно спросить. – ChrisF

+0

Конечно, я мог бы разбить его на: выберите user.username, user.email, user_items.item_number от пользователя осталось присоединиться user_items на user.user_id = user_items.user_id Что я имею в Linq2SQL как: вар users = (from u in db.users Присоединиться к ui в db.user_items на u.user_id равно ui.user_id в useritems из ui в useritems.DefaultIfEmpty() выбрать новый {user = u, item_number = useritems == null? string.Empty: useritems.FirstOrDefault().номер предмета}); Однако он все еще не возвращает все результаты, которые он должен, и я не вижу, где я ошибаюсь. – Neophyte

+0

Если вы отредактируете свой вопрос с этой информацией, вам будет легче понять. – ChrisF

ответ

1

Я нашел мою проблему, я выбирал

useritems.FirstOrDefault().item_number 

Что и я выбрал в, вместо того, что я использовал для моего присоединиться (и FirstOrDefault!):

ui.item_number 

Так что мой полный запрос LINQ является

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

Спасибо за помощь!

1

Вам нужно будет найти конструкцию join ... into ....

Here is an example on MSDN

... Что-то еще, чтобы рассмотреть ... LINQ позволит вам превратить вашу простую структуру таблицы в сложной иерархии. Другим вариантом, помимо левых объединений, будут вложенные запросы. Может быть, что-то вроде этого ...

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

Спасибо, я только видел ваш ответ после публикации моего. Я использовал соединение, только я выбирал неправильную вещь! :) – Neophyte

0

Вы запрос может быть написан более сжато, если вы определили некоторые ассоциации между вашими объектами:

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 
}); 
Смежные вопросы