Я пишу функцию, которая получает соседние (предыдущий и следующий) объекты из базы данных на основе даты. Я выяснил, как вернуть соседей в 2 запросах, но я бы предпочел, если бы я мог вытащить обе сущности одновременно.
public interface IHasDateRange
{
DateTime StartDate { get; set; }
DateTime EndDate { get; set; }
}
public static (TEntity Previous, TEntity Next) GetNeighborsOrDefault<TEntity>(
this IQueryable<TEntity> query, JustDate startDate)
where TEntity : class, IHasDateRange
{
var previous = query.Where(x => x.StartDate < startDate)
.OrderByDescending(x => x.StartDate)
.FirstOrDefault();
var next = query.Where(x => x.StartDate > startDate)
.OrderBy(x => x.StartDate)
.FirstOrDefault();
return (previous, next);
}
Я хотел бы вытащить предыдущее и следующее в одном запрос, предпочтительно таким образом, который не генерирует бегемота sql из перевода слишком сложного выражения.
РЕДАКТИРОВАТЬ Я думаю, что есть способ сделать это, если я удалите фильтр Где для даты начала и вместо этого рассчитайте расстояние. Я все еще застрял, но у меня есть ощущение, что что-то должно работать.
var previous = query
.Select(x => new {
Entity = x,
Distance = DbFunctions.DiffDays(x.StartDate, startDate)
})
.Where(x => x.Distance != 0);
Примечание: предполагается, что у каждого объекта есть уникальная дата начала.
Есть ли простой способ извлечь предыдущие и последующие объекты в одном запросе?