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
5 answers
var query = dbContext.Category.Select(u => new
{
Cat = u,
MovementCount = u.Movement.Count()
})
.ToList()
.OrderByDescending(u => u.MovementCount)
.Select(u => u.Cat)
.ToList();
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
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
}
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();
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 ();