Вопрос

Я использую Castle ActiveRecord в качестве слоя устойчивости.

Я получил эту функцию, которая должна возвращать первых 20 пользователей из базы данных.

IList<User> users = new List<User>();

var userQuery = from u in User.FindAll()
                orderby u.CreationDate
                select u;

return userQuery.Take(20).ToList();

В моей базе данных в настоящее время 100 пользователей, я хочу, чтобы мой запрос возвращал только 20 пользователей, а не 100.

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

Я хотел бы знать, есть ли лучший способ сделать это. Потому что чем больше у меня будет пользователей, тем больше мой запрос будет медленным и не оптимизирован ...

Это было полезно?

Решение

Вот что происходит ..

<Ол>
  • Метод User.FindAll () возвращает массив всех пользователей. (100 строк из БД)
  • Затем вы заказываете и фильтруете этот же массив.
  • С помощью AR 2.0 вы можете использовать ActiveRecordLinqBase вместо ActiveRecordBase и использовать .Queryable вместо, если .FindAll ().

    Этот запрос вернет только 20 записей из базы данных.

    var userQuery = (from u in User.Queryable
                    orderby u.CreationDate
                    select u).Take(20).ToList();
    

    Другие советы

    Создайте пользовательский запрос HQL, который имеет " SetMaxResults " метод. См., Например, руководство пользователя ActiveRecord .

    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top