使用实体框架按查询分组

本文关键字:查询 框架 实体 | 更新日期: 2023-09-27 17:57:14

在我的应用程序中,我有一个与类别关联的运动。我想要一个最常见的类别列表。

我的对象是:

类别: 猫咪ID, 猫咪名称
机芯: 移动, 移动日期, 移动坐骑, 猫ID

我认为它必须使用"分组依据"查询(按catId分组并获取更多内容)来提出它(我在 c# 中使用实体框架 6)

从已经非常感谢你!

使用实体框架按查询分组

重要说明:实体框架 7(现在重命名为 Entity Framework Core 1.0)尚不支持在生成的 SQL 中转换为 GROUP BY()。任何分组逻辑都将在客户端运行,这可能会导致加载大量数据。

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

按类别对运动进行分组,然后选择catid和count。将此结果与类别联接以获取名称,然后按计数降序对结果进行排序。

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
}

我希望这有所帮助:

var query = dbContext.Category.Select(u => new 
{ 
    Cat = u, 
    MovementCount = u.Movement.Count() 
})
.ToList()
.OrderByDescending(u => u.MovementCount)
.Select(u => u.Cat)
.ToList();

我解决了问题!

我使用了"Raja"解决方案的建议(非常感谢!

这将返回由"类别"和"计数"组成的集合。我稍微更改一下以返回类别列表。

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 ();

你只需要在category上使用navigation property 简单地说,你有一个导航属性 在 类别 包含所有相关Movement,我在下面的查询中称之为Movements。 您可以像这样编写查询,与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();