2009-06-25 7 views
0

Ich habe einige SQL, die ich in LINQ zu Entities replizieren möchte. Es hat zu dieser Zeit eine Tabelle mit einer DateTime-Spalte und einem GPS-Standort für eine andere Entität im System. Es verbindet diese Tabelle mit der Ausgabe einer Tabellenwertfunktion, die eine "Zeittabelle" über einen bestimmten Zeitraum generiert. Der Code für diese TVF sieht ungefähr so ​​aus:LINQ zu Entitäten, um eine Verknüpfung zu einer generierten Tabelle zu ersetzen

WHILE @dt_start <= @dt_end 
    BEGIN 
     INSERT INTO @res (dt) VALUES (@dt_start) 
     SET @dt_start = dateadd(ms, @interval_ms, @dt_start) 
    END -- WHILE 

so ist, dann ist das Ergebnis daraus ist Quer eine Liste von GPS-Positionen für das Unternehmen an jeden der erzeugten Zeiten von dt_start zu geben, verbunden dt_end.

Mein Naive Versuch einer einfachen Test sieht aus wie etwas, einige dieser Funktionalität zu replizieren:

 var times = new List<DateTime> {DateTime.Parse("2009-04-04"), 
      DateTime.Parse("2009-04-05")}.AsQueryable(); 
     var query = from gps in Db.GPSDataPointSet 
        from t in times 
        where gps.Driver.Id == 1 && gps.UtcTime <= t 
        group gps by gps.Driver.Id 
        into ggps 
         select ggps.OrderByDescending(gps => gps.Id); 
     var test = query.ToList(); 

Aber offensichtlich funktioniert das nicht - ich schließe es in der Hoffnung, Sie könnte es eine vage Vorstellung geben von dem, was ich hier erreichen will. Hat jemand einen Vorschlag dafür, wie ich die TVF-Funktionalität in einer LINQ to Entities-Abfrage replizieren könnte, ohne dass dies zu ineffizient ist?

+0

Warum funktioniert es nicht? – Timwi

Antwort

0

Wenn Sie nur den Satz von Daten von einer start Zeit zu einer end Zeit generieren möchten, versuchen Sie etwas wie dieses.

public static IEnumerable<DateTime> Intervals(DateTime start, 
     DateTime end, int intervalMs) 
{ 
    int number = (int) ((end - start).TotalMilliseconds/intervalMs); 
    return Enumerable.Range(0, number).Select(i => 
     start + TimeSpan.FromMilliseconds(intervalMs * i)); 
} 
Verwandte Themen