使用Entity Framework的分组查询

3
在我的应用程序中,我有与类别相关联的动作。 我想要一个最常见类别的列表。
我的对象是: 类别: catId, catName
动作: Movid, movDate, movMount, catId 我认为这需要使用“Group By”查询来解决(按catId分组并获取更多信息)(我在c#中使用Entity Framework 6)
非常感谢您!

听起来你知道你需要什么。当你尝试使用GroupBy时,你遇到了什么问题? - Jonesopolis
5个回答

3

仍然不行,顺便说一下 :-( - Simon_Weaver

2

按照类别分组动作,并选择catid和计数。 将这个结果与类别连接以获取名称,然后按计数降序排序结果。

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
}

谢谢Raja!!它对我很有帮助!! - Migue

1
你只需要简单地使用 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();

谢谢Amir!我在“Manager”类中解决了问题,该类具有排名方法。但你所提出的问题很有意思。将此问题发布在类别类中可以帮助很多人!我会结合你提供的解决方案来实现它。 - Migue
我不太明白你想要什么,但是我的linq查询生成的tsql比你检查过的答案更轻量级。在那个查询中,你需要额外的group by和在data base端使用.Count(),但在我的查询中,你没有group by,并且可以从已经获取的结果集中获取Count并在内存中执行此操作。这样可以提高性能。 - Amir Sherafatian
我有以下数据结构:类别:catId(主键),catNombre 运动:Movid(Pk),movDescription,catId,movQuantity我需要一个与运动更相关的类别列表。尝试您的解决方案,但我需要返回“Category”而不是“Cat”的列表。 此外,我如何将类别与运动关联起来?Movements<Movement> public IEnumerable {get; September; } . . . U.Movements.AsEnumerable Movements = () (我需要从数据库中获取它们)谢谢! - Migue

1
我解决了这个问题!
我使用了“Raja”提出的解决方案(非常感谢!)。
这将返回一个由“Category”和“Count”组成的集合。我稍微修改了一下,使其返回一个类别列表。
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 ();

1
我希望这可以帮助您:

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

运行得非常完美!我没有意识到一件事情:当数据库中的外键从Movement指向Category时,EF会在"Category"类上生成一个名为"Movement"的属性。 - Migue

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接