MVC и эффективность данных шаблона репозитория - PullRequest
2 голосов
/ 10 апреля 2010

Мой проект структурирован следующим образом:

DAL

public IQueryable<Post> GetPosts()
{
        var posts = from p in context.Post select p;

        return posts;
}

Услуги

public IList<Post> GetPosts()
{
        var posts = repository.GetPosts().ToList();

        return posts;
}

//Returns a list of the latest feeds, restricted by the count.
public IList<PostFeed> GetPostFeeds(int latestCount)
{
       List<Post> post - GetPosts();

       //CODE TO CREATE FEEDS HERE

       return feeds;

}

Допустим, что GetPostFeeds (5) должен возвращать 5 последних каналов. Поднявшись вверх по списку, разве он не извлекает каждый пост из базы данных из GetPosts (), просто чтобы извлечь из него 5?

Если каждое сообщение, скажем, 5 КБ из базы данных, и есть 1 миллион записей. Разве это не будет 5 ГБ оперативной памяти, используемой для вызова GetPostFeeds ()?

Это так, как это происходит? Должен ли я вернуться к своему DAL и написать запросы, которые возвращают только то, что мне нужно?

Ответы [ 3 ]

3 голосов
/ 10 апреля 2010

Пока вы работаете с IQueryable, выполнение запроса может быть отложено. Запрос выполняется, когда вы вызываете ToList() или делаете что-то еще, что требует выборки данных (например, итерации по дочерней коллекции).

Я не думаю, что вам нужно слишком беспокоиться о вашем DAL, так как мне нравится держать их достаточно стройными. Вы можете воспользоваться преимуществом отложенного выполнения, переписав свой метод GetPostFeeds, например ::

//Returns a list of the latest feeds, restricted by the count.
public IList<PostFeed> GetPostFeeds(int latestCount)
{
   var posts = repository.GetPosts();

   // Perform additional filtering here e.g:
   posts = posts.Take(5);

   return posts.ToList();
}
1 голос
/ 10 апреля 2010

Вы получаете ленивое выполнение, пока не выполните ToList (). В этот момент да, весь комплект и кабачок снесены.

Если вы хотите более интеллектуального выполнения, рассмотрите возможность исключения вызова ToList(). Использование IQueryables во всей цепочке вызовов позволит вашему хранилищу получать только пять необходимых вам записей.

Если у вас есть только пять нужных вам записей, вы можете позвонить ToList().

0 голосов
/ 11 апреля 2010

Согласились, что, используя IQueryable, вы можете избежать возврата всей таблицы. Если вы не хотите, чтобы IQueryable просачивался из вашего DAL, вы можете подумать о том, чтобы переместить вызов take () в DAL, расширив контракт так, чтобы DAL предоставлял метод, который принимает параметр "top n".

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