Linq2sql - >如何通过较低级别的实体进行分组并连接较高级别的数据?

时间:2015-11-16 18:25:40

标签: c# linq-to-sql

我有一个工具,应该在linq2sql PagedList中显示一些聚合数据。

我的实体:

User -> UserSubSkill(with a Level info from 1 to 6) -> SubSkill -> Skill

因此定义了10项技能。每项技能都有很多单项技能。 用户具有从1个初学者到6个专家的熟练程度的子技能。

我的搜索是针对特定技能组合和某种程度的专业知识的过滤器。

我想向用户展示具有指定熟练程度之一的指定单项技能的技能。

显示应该是

User  -  Skill  -  Concatenated list of Subskills of this skill.

示例:

John Doe   -   Programming   -  Tool A (3), Tool B(5) 
John Doe   -   Database      -  Tool DB_1 (5), Tool DB_2 (2)
Jane Dee   -   Programming   -  Tool A (1)

目前我正在使用c#中的Linq2SQL。

目前我有类似的事情:

ctx.UserSubSkill.Include(SubSkill).Include(Subskill.Skill).Include(User).Where(uss => uss.Level > 0 && subSkillsToSearch.Any(sts => sts == uss.SubSkillId))

其中subSkillToSearch是查询所需技能的所有子技能的列表。

1 个答案:

答案 0 :(得分:0)

我发现在创建更复杂的语句时更容易使用查询语法。我相信你正在寻找这样的东西:

var query =
   from u in ctx.Users
   from uss in u.UserSubSkills
   where uss.Level > 0
   where subSkillsToSearch.Contains(uss.SubSkillId)
   group uss by new 
   { 
     u.ID, 
     UserName = u.Name, 
     SkillName = uss.SubSkill.Skill.Name 
   } into uss
   select new
   {
     User = uss.Key.UserName,
     Skill = uss.Key.SkillName,
     SubSkillAndLearningList = uss.Select(x => x.SubSkill.Name + " (" + x.Level + ")")
                                  .ToList()
   };