这可能是一个关于LINQ的新手问题,但假设我有一组具有DateTime属性的项目,一个日期最多只有一个项目,我将如何从参考日期中选择N个最新项目,即,日期小于请求日期的N个项目和最大日期?
我天真的想法是首先选择日期小于参考日期的项目,按日期排序,然后从该子集中选择N个第一项。
var recentItems = from item in dataContext.Items
where item.Date<=date
orderby item.Date descending
select item;
var mostRecentItems = recentItems.Take(5).ToList();
这是“正确”的方式,还是有更好的方法来实现我的目标?
答案 0 :(得分:5)
是的,这是正确的方法。从那里的单词dataContext
判断,我假设这是Linq to SQL代码;它将变为高效的TOP N
查询。
(好吧,只要数据按日期编制索引就“有效”。)
我可能会更改的一件事是删除ToList()
。除非你确实需要它作为列表,否则通常更好地将它作为IEnumerable<T>
单独使用,特别是如果你只需要将它作为一个迭代反对通过索引获取元素。
编辑:我应该参考ToList
来确定更好的含义。当您调用ToList
时,最终会得到一个内存结构,其中包含所有元素集。这会耗尽您并不总是需要使用的内存。创建列表还需要对所有记录进行完整迭代,因此如果您稍后迭代列表本身,则您已经遍历了每个元素两次。
只有5个元素,差异可能不明显;然而,对于5000个元素,它可能非常重要。因此,您应该养成不使用ToList()
的习惯,除非您确定需要它。大多数情况下,你没有。
答案 1 :(得分:3)
是的,这究竟是怎么做的。
答案 2 :(得分:2)
我认为这很好。你也可以用一句话来做这件事:
var recentItems = (from item in dataContext.Items
where item.Date<=date
orderby item.Date descending
select item).Take(5).ToList();
但你的方式同样好。