如何将多个SQL左连接转换为Linq到SQL

如何将多个SQL左连接转换为Linq到SQL,sql,linq,linq-to-sql,Sql,Linq,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.

我有一个用户表、一个用户项目表、一个用户到组表和一个组表

如何将以下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查询完全相同的结果

多谢各位

@克里斯夫


当然,我可以将其分解为:

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

然而,它仍然没有返回它应该返回的所有结果,我看不出哪里出了问题

您需要查看
加入。。。进入…
construct

。。。需要考虑的其他事情… 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,
               };

我发现了我的问题,我正在选择

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

谢谢你的帮助

如果在对象之间定义一些关联,则可以更简洁地编写查询:

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

您是否尝试过将SQL分解为几个步骤,并一次转换为LINQ on步骤?你可能还是会被卡住;)但是您需要向问题中添加更多详细信息和一个具体问题。当然,我可以将其分解为:选择user.username、user.email、user\u items.item\u number from user left加入user.user\u items on user.user\u id=我在linq2sql中拥有的user\u items.user\u id作为:var users=(从db.users中的u将db.user\u中的ui加入到u.user\u id等于ui.user\u id的ui中,然后从useritems.DefaultIfEmpty()中的ui加入到useritems中。选择新建{user=u,item\u number=useritems==null?string。Empty:useritems.FirstOrDefault().item\u number});但是,它仍然没有返回它应该返回的所有结果,我看不出哪里出了问题。如果您使用此信息编辑您的问题,将更容易理解。谢谢,我只是在发布我的问题后才看到您的答案。我使用的是“加入”,只是我选择了错误的内容!:)