2011-11-14 20 views
1

메서드/유창한 구문을 사용하여 Linq에서이 SQL 문에 해당하는 것이 필요합니다.왼쪽 변환 SQL을 메소드로 변환 구문 Linq

SELECT u.[UserId], s.[UserId], d.[UserId] 
FROM dbo.[Attachment] z 
INNER JOIN dbo.[Activity] a ON z.[ActivityId] = a.[ActivityId] 
INNER JOIN dbo.[Case] c ON a.[CaseId] = c.[CaseId] 
INNER JOIN dbo.[CaseUser] x ON c.[CaseId] = x.[CaseId] 
INNER JOIN dbo.[User] u ON x.[UserId] = u.[UserId] 
LEFT OUTER JOIN dbo.[User] s ON u.[SupervisorId] = s.[UserId] 
LEFT OUTER JOIN dbo.[User] d ON s.[SupervisorId] = d.[UserId] 
WHERE u.[UserId] = @x OR s.[UserId] = @x OR d.[UserId] = @x 

또한, 나는 내가 System.Linq.Expressions.Expression 객체를 반환해야합니다 맥락에서 그것을 사용할 수 있습니다. 예를 들어, 기존의 간단한 코드의 예는 다음과 같습니다 나는 부울로 평가 메서드 구문을 사용하여 조인 왼쪽으로 난처한 상황에 빠진

public override Expression<Func<Attachment, bool>> MatchingCriteria 
{ 
    get { return a => a.Activity.Case.CaseUsers.Any(x => (x.User.Id == this.id)); } 
} 

. 다음과 같은 방법을 사용하여

return a => a.Activity.Case.CaseUsers 
    .Where(cu => cu.User.Id == this.id || 
      (cu.User.Supervisor != null && 
      cu.User.Supervisor.Id == this.Id) || 
      (cu.User.Supervisor != null && 
      cu.User.Supervisor.Supervisor != null && 
      cu.User.Supervisor.Supervisor.Id == this.Id)); 

답변

1

본인은 다음과 같은 작업을해야 ... 당신은 모델에서 관련 개체가 null이 있는지 확인하십시오 생각하고 비교를 할 필요한 ID 중 하나가 존재하는지 확인하고 항목을 선택합니다. 같은 샘플 클래스 정의와

:

class Foo 
{ 
    public int FirstBarId { get; set; } 

    public int SecondBarId { get; set; } 
} 

class Bar 
{ 
    public int BarId { get; set; } 
} 

당신이 좋아하는 조회 할 수 있습니다 :이 아니라고

var query = fooSet.Select(foo => new 
        { 
         Foo = foo, 
         Bar1 = barSet.FirstOrDefault(bar => foo.FirstBarId == bar.BarId), 
         Bar2 = barSet.FirstOrDefault(bar => foo.SecondBarId == bar.BarId) 
        }) 
        .Where(x => x.Bar1 != null || x.Bar2 != null); 
+0

참고 조인 따라서, 올바른 사용자가 반환되지 않습니다. – Polity

+0

글쎄, 나는 어디 까지나 사용자 체인을 따라 UserId가 존재하는지 테스트하고 있기 때문에 WHERE를 ANY로 바꿨다. 그것은 효과가있는 것처럼 보이지만 더 많이 테스트 할 것입니다. 머리를 가져 주셔서 감사합니다. – alphadogg

+0

SelectMany 또는 Join을 사용하여이 작업을 수행하는 방법에 대해 궁금합니다. – alphadogg

1

당신은 : 그렇지 않은 경우

+0

사실, 해당 클래스는 재귀 클래스입니다. class User {public User Supervisor {get; 설정};}} – alphadogg

+0

@alphadogg - 그건 변하지 않습니다 :) – Polity

+0

그렇지 않습니까? 내 문제는 여러 단계의 어린이를 따라 다니는 방법 인 반면 Foo에 두 개의 "독립적 인"바 자녀가 있다는 것을 의미합니까? – alphadogg