На самом деле поведение, которое вы оплакиваете, хорошее, потому что оно не дает вам выстрелить себе в ногу.Если бы вам было разрешено это сделать, это привело бы к n
обходам базы данных (где n
- количество постов), и каждое из этих обходов извлекло бы все данные для всехОтветы, когда все, что вы хотели, было Count
.Это может оказать огромное влияние на производительность.
То, что вы хотите сделать, - это создать объект, который представляет всю необходимую вам информацию из базы данных, а затем создать запрос LINQ, который фактически загрузит всю информацию.вы ожидаете использовать.
public class PostSummary
{
public Post Post {get;set;}
public int AnswerCount {get;set;}
}
public IEnumerable<PostSummary> GetPostSummariesByUserAndDateRange(
int userId, DateTime start, DateTime end)
{
using (var context = new MyEntities())
{
return context.Posts
.Where(p => p.UserId == userId)
.Where(p => p.TimeStamp < start && p.TimeStamp > end)
.Select(new PostSummary{Post = p, AnswerCount = p.Answers.Count()})
.ToList();
}
}
Это создает один запрос SQL и за один цикл выдает именно ту информацию, которую вы хотели, без загрузки тонны информации, которая вам не нужна.
Обновление
Если NHibernate работает так же, как Hibernate в Java, он не будет выполнять отложенную загрузку после удаления контекста.Entity Framework действительно дает вам много вариантов в этих направлениях: какой из них работает лучше всего, будет зависеть от вашей конкретной ситуации.Например:
- Вместо того, чтобы ограничивать свой контекст в методе доступа к данным, вы можете продлить контекст (как один раз для каждого запроса в веб-приложении), так что отложенная загрузка свойств будетпродолжайте работать за пределами ваших методов доступа к данным.
- Вы можете с готовностью загружать любые ассоциации сущностей, которые, как вы знаете, вам понадобятся.
Вот пример активной загрузки:
public GetAllPostsAndAnswersForThisMonth()
{
using (var context = new MyEntities())
{
return context.Posts.Include("Answers")
.Where(p => p.UserID == UserID)
.ToList();
}
}
Однако, поскольку Entity Framework в основном составляет ваш уровень «Доступ к данным», я все равно буду утверждать, что наилучшей практикой будет создание класса или набора классов, которые точно моделируют то, чего на самом деле хочет ваш бизнес-уровень.уровень данных, а затем иметь метод доступа к данным производить объекты этих типов.