Как преобразовать несколько левых соединений SQL в Linq-To-SQL - PullRequest
1 голос
/ 20 июня 2010

У меня есть пользовательская таблица, таблица user_items, таблица user_to_group и таблица группы.

Как преобразовать следующий запрос 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}); 

Тем не менее, он все еще не возвращает все результаты, которые он должен, и я не вижу, где я иду не так.

Ответы [ 3 ]

1 голос
/ 20 июня 2010

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

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 голос
/ 20 июня 2010

Вам нужно будет взглянуть на конструкцию join ... into ....

Вот пример на 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 голосов
/ 21 июня 2010

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

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
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...