2013-06-05 3 views
3

У меня есть коллекция объектов, которая имеет (помимо всего прочего) значение DateTime. Я хотел бы запросить БД (с Entity Framework) для всех сущностей, больших, чем определенный DateTime, а также получить значение closests во времени из этого DateTime. Временные точки распределены неравномерно, и я хочу только сделать один db roundtrip.Entity framework выбирает сущности больше, чем DateTime (плюс сущность до)

Пример: [{Т = 1}, {Т = 2}, {Т = 3}, {Т = 4}]

Так ... если я запрос БД для объекта с timevalue больше или равно T = 3, я также хочу вернуть значение T = 2. То есть

Результат: [{Т = 2}, {Т = 3}, {Т = 4}]

Возможно ли это? Если нет, возможно ли это в SQL?

ответ

3

Это вернет две группы

from o in db.Orders 
group o by o.T >= value into g 
select g.Key ? g.OrderBy(x => x.T) : 
       g.OrderByDescending(x => x.T).Take(1) 

Одна группа будет содержать объекты, которые имеют T >= value и другая группа будет иметь объект перед (если таковые имеются).

UPDATE как @Gert Arnold правильно указал, этот запрос будет работать с Linq to SQL, но не будет работать с Entity Framework. Вместо группировки вы должны использовать объединение двух подзапросов:

db.Orders.Where(o => o.T >= value) 
     .Union(db.Orders.Where(o => o.T < value) 
         .OrderByDescending(o => o.T) 
         .Take(1)); 
+1

Хорошее решение, но EF его не разрешит (что-то вроде «Вложенный запрос не разрешен»). Ближайшей возможной вещью будет Союз двух запросов ('> =' и '<' с 'Take (1)'). –

+0

@GertArnold благодарит за заметку! Я проверил этот запрос в LinqPad с Linq to SQL. Я определенно должен проверить его в EF сейчас :) –

+0

Благодарим вас за ответ. Еще не проверял, но все выглядит отлично. Кстати, есть ли у вас какие-либо идеи о том, как выполняется этот запрос, если я реализовал его как хранимую процедуру? – olif

Смежные вопросы