LINQ to Entities, чтобы заменить объединение сгенерированной таблицы - PullRequest
0 голосов
/ 25 июня 2009

У меня есть несколько SQL, которые я хочу скопировать в LINQ to Entities. У него есть таблица со столбцом DateTime и местоположением GPS в то время для другого объекта в системе. Он CROSS СОЕДИНЯЕТ эту таблицу к выводу табличной функции, которая генерирует «расписание» за определенный период. Код для этого TVF выглядит примерно так:

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

так что результат этого перекрестного соединения дает список местоположений GPS для объекта в каждый из сгенерированных моментов времени от dt_start до dt_end .

Моя наивная попытка простого теста воспроизвести некоторые из этих функций выглядит примерно так:

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

Но, очевидно, это не работает - я включаю это в надежде, что это может дать вам смутное представление о том, чего я пытаюсь достичь здесь. У кого-нибудь есть предложение, как я мог бы воспроизвести функциональность TVF в запросе LINQ to Entities, не будучи слишком неэффективным?

1 Ответ

0 голосов
/ 17 сентября 2010

Если вы просто хотите сгенерировать набор дат от 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));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...