按实体框架分组查询

时间:2014-04-06 23:21:07

标签: c# linq entity-framework group-by entity-framework-6

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

我的目标是:

类别 catId ,catName
运动:Movid,movDate,movMount, catId

我认为必须通过“分组依据”查询来提升它(按照catId进行分组并获得更多) (我在c#中使用Entity Framework 6)

非常感谢你!

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

按类别对动作进行分组,然后选择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
}

答案 2 :(得分:1)

您只需要在navigation property上使用category,您在类别上的导航属性包含所有相关的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();

答案 3 :(得分:1)

我希望这有帮助:

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

答案 4 :(得分:0)

我解决了这个问题!

我使用了&#34; Raja&#34;解决方案(非常感谢!)。

这将返回一个由&#34;类别&#34;组成的集合。和&#34;伯爵&#34;。我稍微改变它以返回类别列表。

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