Лучший способ получить последние x записей в хронологическом порядке - PullRequest
2 голосов
/ 22 января 2010

Я пытаюсь получить последние x записей в хронологическом порядке. в настоящее время я делаю:

var query = db.OrderByDecending(x => x.date).Take(x).OrderBy(x => x.date)

Кажется сумасшедшим, что сортировка в одном направлении ограничивает, а затем сортирует в другом. Не то, что я сейчас использую, вызывает у меня бессонные ночи, мне просто интересно, есть ли лучший способ ...

Ответы [ 3 ]

4 голосов
/ 22 января 2010

При втором вызове OrderBy список уже отсортирован, но в неправильном порядке. Поэтому вы можете позвонить Reverse, что будет быстрее.

var query = db.OrderByDescending(x => x.date).Take(x).Reverse();
0 голосов
/ 22 января 2010

Требуется какая-то структура данных потокового буфера, но вы можете довольно легко написать метод 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;
    }
}
0 голосов
/ 22 января 2010

Это зависит от того, что на самом деле означает «дБ». Если это коллекция, то SLaks совет стоит. С другой стороны, ff - это база данных SQL, и это запрос linq2sql или linq to EF, тогда на самом деле два OrderBy лучше. В этом суть SQL: опишите желаемый результат и дайте механизму базы данных определить оптимальный путь доступа и план запроса для удовлетворения вашего запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...