2011-11-14 68 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)); } 
} 

我通過使用左側計算結果爲布爾方法的語法聯接難倒。

回答

1

我認爲下面應該工作...你檢查,以確保在模型中的相關實體不爲空,然後做一個比較,如果它不是:

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)); 
+0

請注意,這不是一個連接,因此,不會返回正確的用戶。 – Polity

+0

嗯,我用ANY替換了WHERE,因爲我正在測試用戶鏈上UserId的存在。它似乎工作,但會測試更多。感謝您的高舉。 – alphadogg

+0

我很好奇,看看如何使用SelectMany或Join來完成這項工作,儘管... – alphadogg

1

使用下面的方法,你既可以檢查是否存在任何一個必需的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

其實,這個類是遞歸的:class User {public User Supervisor {get;設置;}} – alphadogg

+0

@alphadogg - 這不會改變一件事:) – Polity

+0

不是嗎?我的意思是你有兩個「獨立」的酒吧孩子到Foo,而我的問題是如何走下多層次的孩子? – alphadogg