2009-06-25 6 views
0

J'ai un SQL que je cherche à répliquer dans LINQ to Entities. Il a une table avec une colonne DateTime et un emplacement GPS à ce moment-là pour une autre entité dans le système. Il CROSS JOINS cette table à la sortie d'une fonction table valorisée qui génère une "table de temps" sur une période spécifique. Le code de cette TVF ressemble à:LINQ to Entities pour remplacer une jointure par une table générée

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

donc le résultat de cette croix est jointe à donner une liste des emplacements GPS pour l'entité à chacun des temps générés par dt_start à dt_end.

Mon Naive tentative d'un test simple de reproduire une partie de cette fonctionnalité ressemble à quelque chose comme ceci:

 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(); 

Mais évidemment, cela ne fonctionne pas - j'inclure dans l'espoir qu'il pourrait vous donner une vague idée de ce que j'essaie de réaliser ici. Quelqu'un at-il une suggestion sur la façon dont je pourrais répliquer la fonctionnalité TVF dans une requête LINQ to Entities, sans que ce soit trop inefficace?

+0

Pourquoi ça ne marche pas? – Timwi

Répondre

0

Si vous voulez juste générer l'ensemble des dates d'un temps start à un temps end, essayez quelque chose comme ceci.

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)); 
} 
Questions connexes