Agrupar pela pesquisa com a plataforma de entidades

na minha aplicação, tenho movimentos associados aCategoria . Quero uma lista da categoria mais frequente.

Os meus objectos são:

Categoria: catId, catName
Movimento: Movid, movDate, movMount, catId

Acho que teria que levantá-lo com uma consulta "Grupo A grupo" (agrupando por catId e obtendo mais) (Im a utilizar o quadro 6 da entidade em C#)

Muito obrigado. much!

Author: Saverio Terracciano, 2014-04-07

5 answers

Espero que isto ajude.
var query = dbContext.Category.Select(u => new 
{ 
    Cat = u, 
    MovementCount = u.Movement.Count() 
})
.ToList()
.OrderByDescending(u => u.MovementCount)
.Select(u => u.Cat)
.ToList();
 1
Author: Amir Sherafatian, 2014-04-07 18:38:48

Importante: O Entity Framework 7 (agora renomeado para Entity Framework Core 1.0) ainda não suporta GroupBy() para tradução para grupo por em SQL gerado. Qualquer lógica de agrupamento será executado no lado do cliente, o que pode causar um monte de dados a serem carregados.

Https://blogs.msdn.microsoft.com/dotnet/2016/05/16/announcing-entity-framework-core-rc2

 3
Author: Simon_Weaver, 2016-05-25 19:31:31

Agrupar os movimentos por categoria e seleccionar catid e contagem. junte este resultado com categoria para obter o nome e, em seguida, descendente ordenar os resultados na contagem.

var groupedCategories = context.Movements.GroupBy(m=>m.catId).Select(g=>new {CatId = g.Key, Count = g.Count()});    
var frequentCategories = groupedCategories.Join(context.Categories, g => g.CatId, c => c.catId, (g,c) => new { catId = c.catId, catName = c.catName, count = g.Count }).OrderByDescending(r => r.Count);

foreach (var category in frequentCategories)
{
 // category.catId, category.catName and category.Count
}
 1
Author: Raja Nadar, 2014-04-06 23:48:13

Você só precisa usar navigation property em category simplesmente, você tem uma propriedade de navegação na categoria contém todos os relacionados Movement, eu chamo-o Movements na consulta seguinte. você pode escrever sua consulta assim, com o mínimo de conexão com DB.

class Cat
{
     public Guid catId { get; set; }
     public string catName { get; set; }
     public IEnumerable<Movement> Movements { get; set; }
     public int MovementsCount { get { return Movements.Count(); } }
}

var Categories = category.Select(u => new Cat() 
{
    u.catId, 
    u.catName,     
    Movements = u.Movements.AsEnumerable()
}).ToList();

var CategoriesIncludeCount = Categories.OrderBy(u => u.MovementsCount).ToList();
 1
Author: Amir Sherafatian, 2014-04-07 17:55:58
Resolvi o problema! Eu usei a proposta da solução "Raja" (Muito obrigado!).

Isto devolve uma colecção composta por" categoria "e"contagem". Eu altero um pouco para devolver uma lista de categorias.

var groupedCategories = model.Movement.GroupBy(m => m.catId).Select(
                                g => new {catId= g.Key, Count = g.Count() }); 

var freqCategories= groupedCategories.Join(model.Category, 
                                              g => g.catId, 
                                              c => c.catId, 
                                              (g, c) => new {category = c, count = g.Count}).OrderByDescending(ca => ca.count).Select(fc => fc.category).ToList ();
 0
Author: Migue, 2014-04-07 14:33:31