C# 如何在LINQ中执行以下查询?
我想使用LINQ执行以下查询:C# 如何在LINQ中执行以下查询?,c#,linq,C#,Linq,我想使用LINQ执行以下查询: 所有单位的计数 所有单元得分和总分之和 平均:分数分数分数%Totalmarks*100 4)排名 基于分数排名(如果user1只完成了单元id为100和101的2个单元,则应与其他用户进行比较) DB: 代码: 您的自适应函数以及我引入的用于存储结果的额外类: public class UserRankObject { public int Rank { get; set; } public int UserId { get; set; }
- 所有单位的计数
- 所有单元得分和总分之和
- 平均:分数分数分数%Totalmarks*100 4)排名
- 基于分数排名(如果user1只完成了单元id为100和101的2个单元,则应与其他用户进行比较)
您的自适应函数以及我引入的用于存储结果的额外类:
public class UserRankObject
{
public int Rank { get; set; }
public int UserId { get; set; }
public float AverageScore { get; set; }
}
public UserRankObject GetUserRankObject(int? Student_ID, int? CourseID, int? SemID, int? SubjectID)
{
// TODO: add null checks for arguments, or make them non-nullable.
var scoreCard =
dbcontext.Stu_Result
.Where(u => u.CourseID == CourseID
&& u.SemID == SemID
&& u.SubjectID == SubjectID);
return scoreCard.GroupBy(u => u.UserID)
.OrderByDescending(g => g.Average(u => u.ScoredMarks / u.TotalMarks * 100))
.Select((g, i) => new UserRankObject
{
UserId = g.Key,
Rank = i + 1,
AverageScore = g.Average(u => u.ScoredMarks / u.TotalMarks * 100)
})
.Single(u => u.UserId == Student_ID);
}
用法:
var ranked = new List<UserRankObject>()
{
GetUserRankObject(1022, 109, 3000, 2006),
GetUserRankObject(1021, 109, 3000, 2006)
};
Console.WriteLine("Ranked: \n" + string.Join("\n", ranked.Select(r => $"{r.Rank}. {r.UserId} ({r.AverageScore})")));
/*
Ranked:
1. 1022 (77.5)
2. 1021 (51.66667)
*/
var排名=新列表()
{
GetUserRankObject(102210930002006),
GetUserRankObject(102110930002006)
};
Console.WriteLine(“排名:\n”+string.Join(“\n”,排名.Select(r=>$”{r.Rank}.{r.UserId}({r.AverageScore})”));
/*
排列:
1.1022 (77.5)
2.1021 (51.66667)
*/
user id with 1021已完成3个单元90+40+35与其他用户相比,此分数不单unit@Arfat,请参阅编辑。这就是你想要的吗?我正在传递userid courseid semid subject,我需要一个Linq查询,在那里我可以得到学生的平均分数和排名。排名:例如,如果用户使用不同的id完成了2个单元,那么该id单元的分数仅与其他用户进行比较。请查看编辑的数据库userid 1022已完成2个单元(id:100和101)userid 1021已完成3个单元(id:100101102),如果我通过userid(1022)courseid(109)semid(3000)subjectid(2006)然后结果应为平均值,即得分标记/总分*100,即77.5,用户1022的排名为1,用户1021的排名为b2@Arfat,请参阅编辑。这是你想要的吗?您也不需要semid
、subjectid
和courseid
甚至userid
,因为它们不参与计算。您是否尝试过调用Sum()
或Count()
方法?
public class UserRankObject
{
public int Rank { get; set; }
public int UserId { get; set; }
public float AverageScore { get; set; }
}
public UserRankObject GetUserRankObject(int? Student_ID, int? CourseID, int? SemID, int? SubjectID)
{
// TODO: add null checks for arguments, or make them non-nullable.
var scoreCard =
dbcontext.Stu_Result
.Where(u => u.CourseID == CourseID
&& u.SemID == SemID
&& u.SubjectID == SubjectID);
return scoreCard.GroupBy(u => u.UserID)
.OrderByDescending(g => g.Average(u => u.ScoredMarks / u.TotalMarks * 100))
.Select((g, i) => new UserRankObject
{
UserId = g.Key,
Rank = i + 1,
AverageScore = g.Average(u => u.ScoredMarks / u.TotalMarks * 100)
})
.Single(u => u.UserId == Student_ID);
}
var ranked = new List<UserRankObject>()
{
GetUserRankObject(1022, 109, 3000, 2006),
GetUserRankObject(1021, 109, 3000, 2006)
};
Console.WriteLine("Ranked: \n" + string.Join("\n", ranked.Select(r => $"{r.Rank}. {r.UserId} ({r.AverageScore})")));
/*
Ranked:
1. 1022 (77.5)
2. 1021 (51.66667)
*/
public GetCalculatePerform(int? Student_ID, int? CourseID, int? SemID, int? SubjectID)
{
var scoreCard = dbcontext.Stu_Result
.Where(u => u.CourseID == CourseID && u.SemID == SemID && u.SubjectID == SubjectID )
.ToList()
.GroupBy(u => u.UserID)
.OrderByDescending(grp => grp.Average(u => u.ScoredMarks))
.Select((grp, i) => new
{
UserId = grp.Key,
Rank = i + 1,
AverageScore = grp.Average(u => u.ScoredMarks)
}).ToList().Single(u => u.UserId == Student_ID);
}
public class GetCalculatePerform
{
abcEntities dbcontext = new abcEntities();
public UserRankObject tempobj { get; set; }
//********************************************************Performance & Rank Calculation********************************************
public GetCalculatePerform(int? Student_ID, int? CourseID, int? SemID, int? SubjectID)
{
var scoreCard = dbcontext.Stu_Result
.Where(u => u.CourseID == CourseID && u.SemID == SemID && u.SubjectID == SubjectID)
.ToList()
.GroupBy(u => u.UserID)
.OrderByDescending(grp => grp.Average(u => u.ScoredMarks))
.Select((grp, i) => new UserRankObject
{
UserId = grp.Key,
Rank = i + 1,
AverageScore = grp.Average(u => u.ScoredMarks)
}).ToList().Single(u => u.UserId == Student_ID);
// .FirstOrDefault(u=>u.UserId == Student_ID);
this.tempobj = scoreCard;
}
}