Это запрос SQL, который вам нужен:
select
c.Id as CategoryId,
c.CategoryName,
sc.Id as SubCategoryId,
sc.SubCategoryName,
AVG(r.Marks) as Average
from Result r
join Topic t on r.TopicId = t.Id
join SubCategory sc on t.SubCategoryId = sc.Id
join Category c on sc.CategoryId = c.Id
group by c.Id, c.CategoryName, sc.Id, sc.SubCategoryName
И то же самое с синтаксисом запроса LINQ:
using (var db = new TopicContext())
{
// build the query
var query =
from r in db.Result
join t in db.Topic on r.TopicId equals t.Id
join sc in db.SubCategory on t.SubCategoryId equals sc.Id
join c in db.Category on sc.CategoryId equals c.Id
group r by new { c.Id, c.CategoryName, SubCategoryId = sc.Id, sc.SubCategoryName } into gr
select new
{
CategoryId = gr.Key.Id,
CategoryName = gr.Key.CategoryName,
SubCategoryId = gr.Key.SubCategoryId,
SubCategoryName = gr.Key.SubCategoryName,
Average = gr.Average(x => x.Marks)
};
// ToList() method executes the query, so we get the result on that line of code
var result = query.ToList();
}
Если у вас есть существующая база данных, вы можете использовать EF Core
для генерации собственного dbContext
(в моем примере это класс TopicContext
) с помощью команды Scaffold-DbContext
.Вы можете найти пример этой команды на этой странице .Чтобы использовать эту команду, вы должны установить пакет Microsoft.EntityFrameworkCore.Tools
nuget вместе с Microsoft.EntityFrameworkCore.SqlServer
.