Каста ActiveRecord - LINQ оптимизированный запрос - PullRequest
0 голосов
/ 26 ноября 2009

Я использую 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 первых.

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

Ответы [ 2 ]

3 голосов
/ 27 ноября 2009

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

  1. Метод User.FindAll () возвращает массив всех пользователей. (100 строк из БД)
  2. Затем вы заказываете и фильтруете тот же массив.

С AR 2.0 вы можете использовать ActiveRecordLinqBase вместо ActiveRecordBase и использовать вместо .Queryable, если .FindAll ().

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

var userQuery = (from u in User.Queryable
                orderby u.CreationDate
                select u).Take(20).ToList();
0 голосов
/ 27 ноября 2009

Создайте пользовательский запрос HQL с методом «SetMaxResults». См. ActiveRecord Руководство пользователя для примера.

...