2017-02-08 12 views
1

私は次のような結果を得る実行した場合、クエリ、持って存在していない場合は個別値を選択します。
をクエリ:他の場所

SELECT FROM Ticket WHERE ClosedOn IS NULL AND AssignedToTeamID = 1 AND TicketPriorityID = 2 

結果:

Query results

今私たちが望むのは次のクエリです:
クエリ:

SELECT DISTINCT ServerID, SiteID, 
    Case when(DetectorID-DetectorID%10) not in 
       (Select Distinct SiteID FROM Ticket 
       where SiteID is not NULL 
        and ClosedOn is null 
        and AssignedToTeamID = 1 
        and TicketPriorityID in (1, 2)) 
       THEN DetectorID-DetectorID%10 
    end as DetectorID 
FROM Ticket 
where ClosedOn is null 
    and AssignedToTeamID = 1 
    and TicketPriorityID in (1, 2) 

結果:
Result of query

さて、これは私が(最初の結果がNULLである理由、NULL、NULLを知ってはいけない)を取得したい結果です。しかし、今はそれほど重要ではありません。

私の質問:

私は自分のコード内でクエリを得るのですか?
私が今持っている何を(最初のクエリの結果は):

 User user = ObjectContext.Users 
     .Include("TeamMemberships") 
     .First(u => u.UserID == userID); 

     var teamIDs = user.TeamMemberships.Select(t => t.TeamID).ToList(); 
      var test = ObjectContext.Tickets 
      .Include("TicketPriority") 
      .Include("TicketStatu") 
      .Include("TicketType") 
      .Include("Server") 
      .Include("Site") 
      .Include("Detector") 
      .Include("Detector.Site") 
      .Include("Detector.Track") 
      .Include("Team") 
      .Include("User") 
      .Include("User1") 
      .Where(t => (withinTeam.HasValue ? withinTeam.Value ? teamIDs.Contains((int)t.AssignedToTeamID) : !teamIDs.Contains((int)t.AssignedToTeamID) : true)) 
      .Where(t => t.ClosedOn == null) 
      .Where(t => t.TicketPriorityID == 1 || t.TicketPriorityID == 2); 
      return test; 

私はここでのif文/ケースを置く方法がわかりません。このような

答えて

0

何か:

ctx.Tickets 
    .Where(t => t.ClosedOn == null && 
     t.AssignedToTeamId == 1 && 
     (t.TicketPriorityId == 1 || t.TicketPriorityId == 2))  
    .Select(t => new 
    { 
     t.ServerId, t.SiteId, 
     DetectorId = t.DetectorId - t.DetectorId % 10 
    }) 
    .Select(x => new 
    { 
     x.ServerId, x.SiteId, 
     DetectorId = ctx.Tickets 
      .Where(t => t.SiteId != null && t.ClosedOn == null && 
       t.AssignedToTeamId == 1 && 
       (t.TicketPriorityId == 1 || t.TicketPriorityId == 2)) 
      .Any(t => t.Id == x.DetectorId) ? 
      (int?) null : x.DetectorId 
    }) 
    .ToArray(); 

あなたはIncludeとそれを組み合わせる必要がある場合は、最良の方法は、あなたが必要とする行の選択IDのこと(私は数が少ないと仮定)、その後1つの以上のクエリを実行します含むとt => ids.Contains(t.Id)。またはサブクエリとしてWhereに配置することもできます。最後の方法は、手動結合を使用することです(カスタム計算フィールドと単純結合フィールドの両方が必要な場合は必須です)。

+0

** t.Id **はどこから来たのですか?どのように私はこれを返すのですか?変数x = infrontを代入してから、それを返します。 – Mitch

+0

独自のクラスを作成し、匿名型の代わりに使用できます。これは単なる一般的なアプローチの例です。以下のコード中のtは、どこでの条件を意味します。 – oryol

関連する問題