在我的应用程序中,我有一个与类别关联的运动。我想要一个最常见的类别列表。
我的对象是:
类别: 猫咪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();