2013-04-30 79 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