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

本文关键字:连接 数据 较高级 实体 何按 较低级 Linq2sql- gt | 更新日期: 2023-09-27 18:22:04

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

我的实体:

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是查询要查找的技能的所有子技能的列表。

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

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

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()
   };