2011-11-14 15 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

...あなたは、モデル内の関連するエンティティがnullでないことを確認するためにチェックし、そうでない場合の比較を行います。

次のメソッドを使用して
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

私は基本的にユーザーチェーンに沿ってUserIdの存在をテストしているので、WHEREをANYに置き換えました。それはうまくいくようですが、もっとテストします。ヘッドアップをありがとう。 – 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; set;}} – alphadogg

+0

@alphadogg - それは事を変えない:) – Polity

+0

それじゃない?私はあなたの子供の複数のレベルを下に歩く方法ですが、あなたはフーに2つの "独立した"バーの子供を持っていることを意味しますか? – alphadogg

関連する問題