2010-06-20 2 views
1

사용자 테이블, user_items 테이블, user_to_group 테이블 및 그룹 테이블이 있습니다.Linq-To-SQL에 여러 개의 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 쿼리와 동일한 결과를 반환 할 수 없습니다입니다.

감사합니다. 내가으로 linq2sql에있는

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

: 그러나

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

, 그것은 여전히 ​​반환하지 않습니다

@ChrisF,

물론, 나는에 그것을 무너 뜨리는 수 결과가 있어야하며 어디서 잘못 될지 알 수 없습니다.

+0

은 여러 단계로 당신의 SQL을 깨고 한 번에 단계에 LINQ로 전환 시도? 여전히 붙어있을 수 있습니다.)하지만 질문에 추가 할 세부 정보와 질문 할 특정 지점이 있습니다. 물론 – ChrisF

+0

, 나는에 그것을 무너 뜨리는 수 : VAR : 선택 user.username, user.email, 사용자 에서 user_items.item_number 내가으로 linq2sql에있는 user.user_id = user_items.user_id 에 user_items 가입 왼쪽 users = (db.users의 u에서 은 u.user_id의 db.user_items에있는 ui와 useritems의 ui.user_id와 같음 useritems.DefaultIfEmpty()에있는 ui의 새로운 {user = u, item_number = useritems == null을 선택 하시겠습니까? string.Empty : useritems.FirstOrDefault().품목 번호}); 그러나 여전히 모든 결과를 반환하지 않으며 어디에서 잘못 될지 알 수 없습니다. – Neophyte

+0

이 정보로 질문을 편집하면 이해하기 쉽습니다. – ChrisF

답변

1

, 내가

useritems.FirstOrDefault().item_number 

을 선택했다 :

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}); 
입니다3210

도움을 주셔서 감사합니다!

1

join ... into ... 구조가 필요합니다.

Here is an example on MSDN

... 뭔가 다른 고려해야 할

... LINQ는 복잡한 계층 구조로 간단한 테이블 구조를 설정 할 수 있습니다. 왼쪽 조인 이상의 다른 옵션은 중첩 된 쿼리입니다. (! 및 FirstOrDefault) 대신 내 가입을 위해 무엇을 사용, 나는이로 선택한 것입니다 같은 아마 뭔가 ... 나는 내 문제를 발견

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 
}); 
관련 문제