在Linq2SQL中,如何在单个查询中获取记录加上序列中的上一个和下一个?

Sco*_*ord 3 linq performance linq-to-sql

给定一个日期,在该日期之前查询最后一条记录的最有效方法是什么,任何等于该日期的记录,以及该日期之后的下一条记录.

它应该在功能上等同于这样的查询:

from asset in Assets
where asset.Id == assetId
select new {
    Previous = (from a in a.Orders where a.Date < myDate orderby a.Date descending select a).FirstOrDefault(),
    Current = (from a in a.Orders where a.Date == myDate select a).SingleOrDefault(),
    Next = (from a in a.Orders where a.Date > myDate orderby a.Date select a).FirstOrDefault()
}
Run Code Online (Sandbox Code Playgroud)

这样,这个查询运行三个查询,并且可能需要通过myDate对数据集进行三次排序才能完成.

一些类似的问题:

Eni*_*ity 5

提供"最有效"的查询取决于您的高效含义.

如果您想要对数据库进行单个查询,按日期进行单一类别的订单,最后按日期进行快速查询,那么我建议以下可能是最有效的.:-)

var orders =
    (from a in Assets
     where a.Id == assetId
     from o in a.Orders
     orderby o.Date
     select o).ToArray();

var previous = orders.LastOrDefault(o => o.Date < myDate);
var current = orders.SingleOrDefault(o => o.Date == myDate);
var next = orders.FirstOrDefault(o => o.Date > myDate);
Run Code Online (Sandbox Code Playgroud)

这应该查询数据库一次以查找与所需资产Id关联的订单,按日期对它们进行排序,并将它们作为数组返回到内存中.由于这是在内存中,现在查找指定日期的当前,上一个和下一个记录的速度非常快.