我试图按时间顺序获取最新的x条目。 目前我在做:按照时间顺序获取最新的x条目的最佳方式
var query = db.OrderByDecending(x => x.date).Take(x).OrderBy(x => x.date)
似乎疯狂在一个方向进行排序,限制,然后在其他分类。它不像我目前使用的是导致我失眠的夜晚,我只是想知道是否有更好的方法...
我试图按时间顺序获取最新的x条目。 目前我在做:按照时间顺序获取最新的x条目的最佳方式
var query = db.OrderByDecending(x => x.date).Take(x).OrderBy(x => x.date)
似乎疯狂在一个方向进行排序,限制,然后在其他分类。它不像我目前使用的是导致我失眠的夜晚,我只是想知道是否有更好的方法...
通过第二个OrderBy
调用,该列表已经排序,但顺序错误。因此,您可以拨打Reverse
,这会更快。
var query = db.OrderByDescending(x => x.date).Take(x).Reverse();
我希望我可以'db.OrderBy(x => x.date).TakeEnd(x)' – Tim 2010-01-22 00:48:51
这取决于'db'实际上是什么。如果它是一个集合,那么SLaks的建议就是。另一方面,ff是一个SQL数据库,这是一个linq2sql查询或一个linq到EF,然后实际上这两个OrderBy更好。这就是SQL的全部内容:描述所需的结果并让数据库引擎找出最佳访问路径和查询计划以满足您的请求。
db是一个IEnumerable包装在一个平面文件数据存储... 我认为Linq2sql会相似,但我想这不会是有效的...... – Tim 2010-01-22 00:55:34
它需要某种流缓冲区数据结构,但您可以很容易地编写一个TakeEnd
方法。虽然在这种特殊情况下使用Reverse可能是一个更好的主意。
这将允许你做这样的事情:使用此代码
var query = db.OrderBy(x => x.date).TakeEnd(x);
:
public static class Ext
{
private class StreamBuffer<T> : IEnumerable<T>
{
private int head = 0;
private bool filled = false;
private T[] stream;
public int Size { get; private set; }
public StreamBuffer(int size)
{
Size = size;
stream = new T[Size];
}
public void Add(T item)
{
stream[head] = item;
head += 1;
if (head >= Size)
{
head = 0;
filled = true;
}
}
public IEnumerator<T> GetEnumerator()
{
int start = filled ? head : 0;
int size = filled ? Size : head;
for (int i = 0; i < size; i += 1)
{
int p = (start + i) % Size;
yield return stream[p];
}
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
public static IEnumerable<T> TakeEnd<T>(this IEnumerable<T> enumerable, int count)
{
StreamBuffer<T> buffer = new StreamBuffer<T>(count);
foreach (T t in enumerable)
{
buffer.Add(t);
}
return buffer;
}
}
它是什么样的平面文件?记录如何存储在它中?它是CSV,制表符分隔? – shahkalpesh 2010-01-22 07:07:29
制表符或逗号分隔的区别是什么? – Tim 2010-01-22 09:54:29
如果文件已按日期排序,则可以读取最后几行而不是使用LINQ。你怎么看? – shahkalpesh 2010-01-22 12:34:44