Я задавался вопросом об этом некоторое время теперь, таким образом, я думал, что будет стоить использовать мой первый пост Переполнения Стека, чтобы спросить об этом.
Предположите, что у меня есть обсуждение со связанным списком сообщений:
DiscussionCategory discussionCategory = _repository.GetDiscussionCategory(id);
discussionCategory. Обсуждения - список предприятий Обсуждения, который в настоящее время не загружен.
То, что я хочу, должно быть в состоянии повторить посредством обсуждений в discussionCategory и сказать, сколько сообщений находится в каждом обсуждении, не принося данные о сообщении.
Когда я попробовал это, прежде чем я должен был загрузить Обсуждения и сообщения так, чтобы я мог сделать что-то вроде этого:
discussionCategory.Discussions.Attach(Model.Discussions.CreateSourceQuery().Include("Messages").AsEnumerable());
foreach(Discussion discussion in discussionCategory.Discussions)
{
int messageCount = discussion.Messages.Count;
Console.WriteLine(messageCount);
}
Это кажется довольно неэффективным мне, поскольку я привлекателен потенциально сотни текстов сообщений от базы данных и удерживания их в памяти, когда все, что я хочу сделать, посчитать их число в представляемых целях.
Я видел некоторые вопросы, которые затрагивают этот предмет, но они, казалось, не обратились к нему непосредственно.
Заранее спасибо за любые мысли Вы можете иметь на этом предмете.
Обновление - еще Некоторый кодекс согласно просьбе:
public ActionResult Details(int id)
{
Project project = _repository.GetProject(id);
return View(project);
}
Тогда в представлении (только, чтобы проверить его):
Model.Discussions.Load();
var items = from d in Model.Discussions select new { Id = d.Id, Name = d.Name, MessageCount = d.Messages.Count() };
foreach (var item in items) {
//etc
Я надеюсь, что это делает мою проблему немного более ясной. Сообщите мне, должны ли Вы еще закодировать детали.
]Легко; просто спроецируйте на POCO (или анонимный) тип:[
] [var q = from d in Model.Discussions
select new DiscussionPresentation
{
Subject = d.Subject,
MessageCount = d.Messages.Count(),
};
]
[]Когда вы посмотрите на сгенерированный SQL, вы увидите, что []Count()[
] выполняется сервером БД.[
]Обратите внимание, что это работает как в EF 1, так и в EF 4.[
].У меня нет прямого ответа, но могу лишь указать вам на следующее сравнение между NHibernate и EF 4.0, которое, кажется, предполагает, что даже в EF 4.0 нет готовой поддержки для получение счетчиков связанной коллекции сущностей без извлечения коллекции.
http://ayende.com/Blog/archive/2010/01/05/nhibernate-vs.-entity-framework-4.0.aspx
Я проголосовал за ваш вопрос и пометил его звездочкой. Надеюсь, кто-нибудь найдет работоспособное решение.