描述
我有三張桌子。
學生
ID 姓名 1 AAA 2 BBB 3 CCC 4 DDD
技能
ID 姓名 1 JS 2 C# 3 角 4 反應 5 jQuery 6 TS 7 F#
學生技能
ID 學生卡 技能ID 1 1 1 2 1 2 3 2 1 4 2 2 5 2 4 6 3 3 7 4 3 8 4 5 9 4 6 10 4 7
從這個表中,我試圖根據他們注冊的課程(技能)獲取學生的詳細資訊。假設必修課程是1、2、3,那么結果應該是。
- ID 為1、2、3、4 的學生
1 (因為他/她匹配技能1,2)
2 (因為他/她匹配技能1,2)
3 (因為他/她匹配技能3)
4 (因為他/她匹配技能3)
- 學生的順序應該是2, 1, 4, 3。
2 (因為他/她符合必修技能1,2并且有額外的一項技能,所以優先級高于StudentID 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 的學生。
4、2、1、3
我怎樣才能實作我上面提到的排序。
uj5u.com熱心網友回復:
您只計算學生擁有的技能數量,而不考慮他們擁有多少所需技能。您可能需要對物件使用 linq,但添加以下子句:
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();
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/506680.html
標籤:C# 。网 实体框架 林克 sql-order-by
