2014-04-06 63 views
2

在我的应用程序中,我有移动类别相关联。 我想要一个最频繁的列表类别按实体框架查询分组

我的对象是:

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

我认为这将有一个提高它“Group By”查询(通过catId分组并获取更多内容) (使用c#中的实体框架6)

非常感谢!

+0

这听起来像你知道你需要什么。当你尝试使用GroupBy时,你有什么问题? – Jonesopolis

回答

1

我希望这会帮助:

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

完美无缺!我没有意识到一件事:当FK(数据库)从运动到类别 – Migue

1

按类别对运动进行分组并选择catid和count。 将此结果与类别结合起来以获得名称,然后按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 
} 
+0

谢谢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(); 
+0

Thiks Amir !,我解决了具有排名方法的“经理”类中的问题。但你提出的很有趣。在类别类中发布此查询可能会有很大帮助!将结合您提供的上述解决方案。 – Migue

+0

我不明白你想要什么,但'tsql'是由我的linq查询生成的,比你检查过的答案要轻。在那个查询中,你需要一个额外的'group by'和''base''中的'.Count()',但是在我的查询中你没有'group by'并且你从结果集中得到'Count'已经被获取并在记忆中这样做。而这,提高你的表现 –

+0

,我有以下数据结构: 类别:CATID(PK),catNombre 运动:Movid(PK),movDescription,CATID,movQuantity 我需要的是更多的相关的类别列表动作。 尝试您的解决方案,但我需要返回“类别”而不是“猫”的列表。 此外,当我将类别与动作联系起来? Movements public IEnumerable {get;九月; } 。 。 。 U.Movements.AsEnumerable Movements =() (我需要从数据库中获取它们) 谢谢! – Migue

0

我解决了这个问题!

我使用了“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();