Me he estado preguntando acerca de esto por un tiempo, así que pensé que valdría la pena usar mi primer post de Stack Overflow para preguntar al respecto.Cómo contar entidades asociadas sin recuperarlas en Entity Framework
Imagínese que tengo una discusión con una lista asociada de mensajes:
DiscussionCategory discussionCategory = _repository.GetDiscussionCategory(id);
discussionCategory.Discussions es una lista de las entidades de discusión que no está cargado en ese momento.
Lo que quiero es poder repetir las discusiones en un discussionCategory y decir cuántos mensajes hay en cada discusión sin obtener los datos del mensaje.
cuando he intentado esto antes he tenido que cargar las discusiones y los mensajes para que yo pudiera hacer algo como esto:
discussionCategory.Discussions.Attach(Model.Discussions.CreateSourceQuery().Include("Messages").AsEnumerable());
foreach(Discussion discussion in discussionCategory.Discussions)
{
int messageCount = discussion.Messages.Count;
Console.WriteLine(messageCount);
}
Esto parece bastante ineficiente a mí como yo estoy retracto potencialmente cientos de mensajes cuerpos de la base de datos y mantenerlos en la memoria cuando todo lo que deseo hacer es contar su número con fines de presentación.
He visto algunas preguntas que tocan sobre este tema, pero no parecen abordarlo directamente.
Gracias de antemano por cualquier idea que pueda tener sobre este tema.
Actualización - Un poco más de código como solicitada:
public ActionResult Details(int id)
{
Project project = _repository.GetProject(id);
return View(project);
}
A continuación, en la vista (sólo para probarlo):
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
espero que hace que mi problema un poco más claro. Avíseme si necesita más detalles del código.
Hola, gracias por la respuesta. Desafortunadamente lo he intentado antes y descubrí que la propiedad de recuento del tipo anónimo devolvió cero en todas las discusiones. Le di otro intento a este método después de ver tu respuesta, pero con el mismo resultado. Tal vez estoy malinterpretando algo sobre el marco en cuanto a que se debe tener en cuenta que las entidades estén "conectadas" al almacén de datos. ¿Alguien más puede confirmar que el método anterior debería funcionar? – Oligarchia
Muestra tu código; estas haciendo algo mal. Usamos esta característica * ampliamente * en nuestras aplicaciones de envío. Sospecho que estás tratando de hacer esto en una propiedad de la asociación EF (como en tu pregunta) en lugar de en una consulta L2E (como en mi respuesta). Esos son completamente diferentes; el primero es LINQ to Objects; el último es LINQ to Entities. –
El código que utilicé fue idéntico en forma al que proporcionó. Tal vez hay algo más arriba en la cadena que sale mal. Veré si puedo editar mi publicación original para proporcionar código adicional si cree que eso ayudará. Gracias de nuevo por tu ayuda. Estoy echando un vistazo a la publicación de blog a la que se vinculó en este momento. – Oligarchia