2010-11-21 5 views
1

Ich versuche, eine Teilmenge von Einträgen aus einer Tabelle zu erhalten, wo der vorherige Eintrag später eine bestimmte Anzahl von Tagen ist (in diesem Fall 2): ​​Kreuztisch zu uns LINQ mit

select t.*, DATEDIFF(day,f.gamedate, t.gamedate) diff 
from Games t 
cross apply (select TOP 1 t2.GameDate from Games t2 
where (t2.TeamID = T.TeamID) and t2.GameDate + 2 = t.GameDate 
order by t2.GameDate Desc) f 

Wie würde Ich erreiche das Gleiche mit LINQ?

+0

Ihre Anfrage scheint nicht die Beschreibung entsprechen, was Sie zu tun versuchen. –

+0

Entschuldigung, es gibt eine zusätzliche Einschränkung basierend auf der TeamID. IE "finde alle Spiele, bei denen das spielende Team (basierend auf teamID) vor 2 Tagen gespielt hat". Ist das sinnvoll? – qi1

Antwort

1

Ich würde das zuletzt gespielte Datum für jedes Team cachen, dann gehe durch alle Spiele und wähle die Spiele aus, die deiner Definition von "gespielt vor 2 Tagen" entsprechen (könnte vor mindestens 2 Tagen gespielt haben, genau vor 2 Tagen, mindestens 2, aber nicht mehr als 3 Tage, etc ...)

var lastPlayedQuery = (from game in Game 
         group game by game.TeamID into g 
         let lastPlayedDate = g.Select(x => x.GameDate).Max() 
         select new { TeamID = game.TeamID, LastPlayedDate = lastPlayedDate }).ToDictionary(x => x.TeamID, x => x.LastPlayedDate); 

var gamesTwoDaysLater = from game in Games 
         let lastPlayedDate = lastPlayedQuery[game.TeamID] 
         let elapsedDays = (game.GameDate - lastPlayedDate).TotalDays 
         where elapsedDays >= 2.00 && elapsedDays < 3.00 
         select game; 

Edit: Finden Sie alle Paare von zwei Tagen

var teamGameLookup = Games.ToLookup(x => x.TeamID); 

var twoDayApartGames = from game in Games 
         join secondGame in teamGameLookup[game.TeamID] 
         on game.GameDate.Date equals secondGame.GameDate.Date.AddDays(2) 
         select new { Game = game, GameTwoDaysEarlier = secondGame }; 

getrennt Spielen

Edit: Finden Sie alle Paare von durch zwischen X bis Y Tage getrennt Spiele

var teamGameLookup = Games.ToLookup(x => x.TeamID); 

    var seperatedGames = from game in Games 
         join otherGame in teamGameLookup[game.GameID] 
         on DatesWithinRange(game.GameDate,otherGame.GameDate,2,25) equals true 
         let daysApart = (game.GameDate - otherGame.GameDate).TotalDays 
         select new { Game = game, OtherGame = otherGame, DaysApart = daysApart}; 

    private bool DatesWithinRange(DateTime firstDate, DateTime secondDate, float lower, float higher) 
    { 
     float elapsedDays = (secondDate - firstDate).TotalDays; 
     return elapsedDays >= lower && elapsedDays <= higher; 
    } 
+0

Danke dafür. Ich denke, ich halte das Problem falsch. Ich denke, das obige gibt Spiele zurück, bei denen das Team buchstäblich vor 2 Tagen gespielt hat. Worauf ich hinaus will, sind Spiele, bei denen das Team zwei Tage vorher gespielt hat ... – qi1

+0

@ qi1 Sie möchten also alle Spielpaare finden, die unabhängig vom aktuellen Datum im Abstand von zwei Tagen gespielt wurden? – cordialgerm

+0

das ist richtig, yep – qi1