【发布时间】:2020-07-28 21:41:00
【问题描述】:
我正在编写一个函数,它根据日期从数据库中获取相邻(上一个和下一个)实体。我已经想出了如何在 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);
注意:假设每个实体都有一个唯一的开始日期。
有没有一种简单的方法可以在单个查询中提取上一个和下一个实体?
【问题讨论】:
标签: c# entity-framework linq asp.net-web-api expression