2014-04-06 64 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();