2013-04-30 51 views
1

我有一個DBSet<User>的用戶。每個用戶都有一個DBSet<Activity>的活動。每個活動本身有一個或沒有名稱的類別。LINQ選擇和排序關係不同

public class User 
{ 
    [...] 
    DBSet<Activity> activity {get;set;} 
} 

public class Activity 
{ 
    [...] 
    Category category{get;set;} 
} 

public class Category 
{ 
    [...] 
    string Name {get;set;} 
} 

現在我想擁有一個所有用戶的列表按活動中給定類別名稱的出現次數排序。換句話說:我想要一個用戶列表,按他的活動數量排序。我怎麼能用LINQ(lambda表達式)做到這一點?

DBSet<User> users; 
string cat="myCategory"; 
var usersByCategoryActivity = users.OrderByDescending(???); 

回答

3

這應該爲你工作:

string cat="myCategory"; 
DBSet<User> users; 
    var usersByCategory = users 
      .OrderBy(e=> e.activity.Count(a => a.Categories.Name.Contains(cat))); 
+0

謝謝。我還需要在Count之前添加'where(a => a.Category!= null)',因爲類別也可以爲null。但是,這是解決方案 – daniel 2013-04-30 14:16:44

+0

@zoidbergi只需將Where謂詞添加到已經有如此謂詞的Count中即可。 .OrderBy(e => e.activity.Count(a => a.Category!= null && a.Categories.Name.Contains(cat))); – 2013-04-30 14:18:19

+0

這比嵌套的.Where快嗎? – daniel 2013-04-30 14:19:01

0

也許

var usersByCategory = users.ToList().OrderBy(e=>e.activity.Count()); 
+0

這不包括類別名稱 – daniel 2013-04-30 14:04:49

+0

沒有看到問題的一部分。我認爲Scorpi0有你的答案。 – jure 2013-04-30 14:06:58

1

類似的東西:

DBSet<User> users; 
string cat = "myCategory"; 
var usersByCategoryActivity = users 
      .OrderByDescending(u => u.Activities 
          .Where(a => a.Categories.Select(c => c.Name) 
                .Contains(cat) 
          .Count() 
        ); 

如果你看看在查詢的第一個,它會檢索所有包含給定類別的活動。它爲用戶統計所有數據,並以此命令。
我不確定這是你需要的,但是你的描述並不準確,並且沒有數據樣本。所以它可能夠好。也許不會。

+0

Count有一個需要謂詞的重載。看到我的答案。 – 2013-04-30 14:10:29