2009-06-25 13 views
0

LINQ to Entitiesで複製しようとしているSQLがあります。それは、システム内の別のエンティティのためのDateTime列とその時のGPS位置を持つテーブルを持っています。 CROSSは、このテーブルを特定の期間に渡って「タイムテーブル」を生成するテーブル値関数の出力に結合します。したがって、これはクロスをdt_endするdt_startから生成された時間の各々におけるエンティティのGPS位置のリストを与えるに接合されている結果から生成されたテーブルへの結合を置換するエンティティへのLINQ

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

:このTVFのコードは次のように見えます。

この機能の一部を複製するための簡単なテストでの私の素朴な試みは、このようなものになります。

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

をしかし、明らかにこれは動作しません - 私はそれがあなたの漠然としたアイデアを与えるかもしれない期待して、それを含めます私がここで達成しようとしていることのLINQ to EntitiesクエリでTVF機能をどのように複製するかについては、あまりにも非効率的ではありませんか?

+0

なぜ機能しないのですか? – Timwi

答えて

0

start時からend時までの日付を生成したい場合は、次のように試してみてください。

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)); 
} 
関連する問題