2010-06-20 50 views
1

我有一個用戶表,一個user_items表,一個user_to_group表和一個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 2010-06-20 15:14:42

+0

當然,我可以把它分解成: 選擇user.username,user.email,從用戶 user_items.item_number留在user.user_id = user_items.user_id 這我倒在LINQ2SQL作爲加入user_items: VAR users =(從db.users中的u開始 將u.user_id中的ui用戶id中的ui等於ui.user_id加入useritems useritems.DefaultIfEmpty() select new {user = u,item_number = useritems == null? string.Empty:useritems.FirstOrDefault()。項目編號});但是,它仍然不會返回它應該的所有結果,而且我也看不到我要出錯的地方。 – Neophyte 2010-06-20 15:26:19

+0

如果您使用此信息編輯您的問題,將會更容易理解。 – ChrisF 2010-06-20 15:42:15

回答

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

謝謝,我只是在發帖後纔看到你的回答。我正在使用join,只有我選擇了錯誤的東西! :) – Neophyte 2010-06-20 16:22:35

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