2013-04-15 3 views
44

은 무엇에 대한 쿼리 것 가입?엔티티 프레임 워크 쿼리

var serv = (from s in db.Services 
       join sl in Location on s.id equals sl.id 
       where sl.id = s.id 
       select s).ToList(); 

하지만 잘못 :

이 내가 쓴 것입니다. 어떤 사람이 나를 길로 인도 할 수 있습니까?

+0

봐 : HTTP : //stackoverflow.com/questions/37324/what-is-the-syntax-for-an-inner-join-in-linq-to-sql –

+1

당신은 '=='비교 대신에'='할당을 사용하고 있습니다. 'where' 절. 또한 해당 필드에 이미 참여한 경우에는 필요하지 않습니다. –

+2

'where sl.id = s.id'가 조인 조건과 중복되지 않습니까? –

답변

71
from s in db.Services 
join sa in db.ServiceAssignments on s.Id equals sa.ServiceId 
where sa.LocationId == 1 
select s 

여기에서 dbDbContext입니다. 생성 된 쿼리는 다음과 같이 표시됩니다 (EF6 샘플).

SELECT [Extent1].[Id] AS [Id] 
     -- other fields from Services table 
FROM [dbo].[Services] AS [Extent1] 
INNER JOIN [dbo].[ServiceAssignments] AS [Extent2] 
    ON [Extent1].[Id] = [Extent2].[ServiceId] 
WHERE [Extent2].[LocationId] = 1 
+2

왼쪽 외부 조인이 아닌가요? –

+3

@JonathanWood 아니요, 내부 결합입니다. 왼쪽 외부 조인은 그룹 조인에 의해 생성됩니다. –

+0

db.Services에서 s를 사용할 수 있습니까? db.ServiceAssignments in s.Id와 sa.ServiceId ** ||를 결합하십시오. s.Id = null ** where sa.LocationId == 1 select –

4

탐색 속성을 사용할 수있는 경우 사용할 수 있습니다. SQL에 내부 조인을 생성합니다.

사람이 방법 구문에 관심있는 경우
from s in db.Services 
where s.ServiceAssignment.LocationId == 1 
select s 
34

당신이 탐색 속성이있는 경우, 그것은 방법 쉽게 :

db.Services.Where(s=>s.ServiceAssignment.LocationId == 1); 

당신이하지 않으면 내가 모르고있어 일부 Join() 재정이 아니라면 나는 꽤 밥맛 보이는 생각 (그리고 나는이 방법 구문 순정이야) :이

db.Services.Join(db.ServiceAssignments, 
    s => s.Id, 
    sa => sa.ServiceId, 
    (s, sa) => new {service = s, asgnmt = sa}) 
.Where(ssa => ssa.asgnmt.LocationId == 1) 
.Select(ssa => ssa.service); 
+0

ServiceAssignment에 대한 FK가 nullable 일 경우이 작업이 수행되지 않습니다. (ssa => ssa.alert.LocationId == 1) .Select (ssa => ssa.service); , 그렇지? – Cardin

+3

@Cardin 그 경우에는 C# 6을 제안하겠습니까? 운영자. 가지고 있지 않다면 탐색 속성을 사용하기 전에 null을 확인하십시오. 일반적으로, 예에서 방어 코드를 추가하지 않으므로 기본 포인트를 혼동하지 않습니다. FK가 nullable이면 다음과 같이 보일 것입니다 : (C# 6) 'db.Services.Where (s = .ServiceAssignment.LocationId == 1); ' 또는 C# 5의 다음과 같습니다 : 'db.Services.Where (s => s.ServiceAssignment! = null && s.ServiceAssignment.LocationId == 1); ' –

+0

@ MichaelBlackburn 사실입니다! 그것은 더 이해할 수 있습니다. 해명 해줘서 고마워. :) – Cardin

관련 문제