LINQ to Entities - Сравнение дат - PullRequest
3 голосов
/ 22 июня 2011

Есть ли лучший (более хороший / эффективный) способ сделать это?

return View(db.Things
    .Where(t => t.DateTimeObj.Month == DateTime.Today.Month 
        && t.DateTimeObj.Day == DateTime.Today.Day)
    .OrderByDescending(e => e.DateTimeObj)
    .Take(num)
);

Следующие не работают (без объекта Date в LINQ to Entites).

Сегодняшние записи:

return View(db.Things
    .Where(t => t.DateTimeObj.Date == DateTime.Today)
    .OrderByDescending(e => e.DateTimeObj)
    .Take(num)
);

Записи последних 24 часов:

return View(db.Things
    .Where(t => t.DateTimeObj > DateTime.Today.AddHours(-24))
    .OrderByDescending(e => e.DateTimeObj)
    .Take(num)
);

Изменить:

Это, кажется, делает трюк:

return View(db.Things
    .Where(t => t.DateTimeObj > SqlFunctions.DateAdd("dd", -1, DateTime.Now))
    .OrderByDescending(e => e.DateTimeObj)
    .Take(num)
);

Возможные ошибки, указанные Крисом Сэйнти:

  1. Только для SQL Server (возможно?)
  2. Вычисления даты задерживаются для выполнения SQL Server, так как предпочли предоставить предварительно вычисленную дату в переводе linq2sql.

Ответы [ 2 ]

3 голосов
/ 22 июня 2011

Взгляните на класс SqlFunctions в msdn , который предоставляет доступ к функциям sql datediff и т. Д.

Обратите внимание, что их нельзя использовать для запуска кода на C #, они просто заполнители, которые анализатор запросов понимает и могут преобразовывать в T-SQL. Очевидно, что это только SQL Server, если другие поставщики не обернули эти функции.

2 голосов
/ 22 июня 2011

Просто объявите свои даты для сравнения до 100 *

var today = DateTime.Today;
return View(db.Things
    .Where(t => t.DateTimeObj.Date == today)
    .OrderByDescending(e => e.DateTimeObj)
    .Take(num)
);

//Last 24 hours records:
var yesterday = DateTime.Now.AddDays(-1);
return View(db.Things
    .Where(t => t.DateTimeObj > yesterday)
    .OrderByDescending(e => e.DateTimeObj)
    .Take(num)
);
...