linq 如何在C# Entityframe-work中实现下面提到的排序结果?

zujrkrfu  于 2022-12-06  发布在  C#
关注(0)|答案(1)|浏览(174)

描述

我有三张table。

学生

| 识别码|名称名称名称|
| - -|- -|
| 一个|美国汽车协会|
| 2个|血脑屏障|
| 三个|CCC认证|
| 四个|限定日|

技能

| 识别码|名称名称名称|
| - -|- -|
| 一个|JS系统|
| 2个|C#语言|
| 三个|Angular |
| 四个|React|
| 五个|jQuery查询|
| 六个|技术支持|
| 七个|F编号|

学员技能

| 识别码|学生ID|技能ID|
| - -|- -|- -|
| 一个|一个|一个|
| 2个|一个|2个|
| 三个|2个|一个|
| 四个|2个|2个|
| 五个|2个|四个|
| 六个|三个|三个|
| 七个|四个|三个|
| 八个|四个|五个|
| 九个|四个|六个|
| 10个|四个|七个|
我尝试从该表中根据学员注册的课程(技能)获取学员的详细信息。假设必修课程为1,2,3,则结果应为。

  • 学生ID1,2,3,4

1 (因为他/她匹配技能1,2
2 (因为他/她匹配技能1,2
3 (因为匹配技能3
4 (因为他/她匹配技能3

  • 学员的顺序应为2、1、4、3

2 (由于符合必学技能1,2,且多一项技能,优先级高于学号1
1 (因为他/她匹配所需技能1,2
4 (由于他/她匹配了必需技能3,并且有额外的三个技能,所以优先级高于StudentID 3
3 (因为他/她匹配所需技能3

我所尝试的
var requiredSkillIds = new List<int>() { 1, 2, 3 }; // Required Skills.
    
var studentIds= (await _studentSkill.GetByAsync(x => requiredSkillIds.Contains(x.skillId))).Select(x => x.StudentID).ToList();
    
var result = await _dbContext.Students.Where(x => studentIds.Contains(x.Id).Include(x =>x.StudentSkills).OrderByDescending(x =>x.StudentSkills.Count).ToListAsync();

问题是,我得到的结果,但排序是在学生的总技能计数。
所以,排序后的结果是有ID的学生。

四、二、一、三

我怎样才能实现我上面提到的排序。

yqyhoc1h

yqyhoc1h1#

你只计算了学生的技能数量,而没有考虑他们所需要的技能数量。你可能需要使用linq to objects,但是要添加这个子句:

var result = await _dbContext.Students.Include(s => s.StudentSkills)
    .Where(s => studentIds.Contains(s.Id))
    .OrderByDescending(s => s.StudentSkills.Count(k => requiredSkillIds.Contains(k.SkillId)))
    .ThenByDescending(s => s.StudentSkills.Count);
    .ToListAsync();

相关问题