在我的应用程序中,我有类别 移动。 我想要一个最常见的类别的列表。
我的目标是:
类别: catId ,catName
运动:Movid,movDate,movMount, catId
我认为必须通过“分组依据”查询来提升它(按照catId进行分组并获得更多) (我在c#中使用Entity Framework 6)
非常感谢你!
答案 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 ();