LINQ-запросы из связанных таблиц для MVC

Дано три таблицы:
Students ключ Id
Rates ключи StudentId, DisciplineId
Disciplines ключ Id

То есть студентов может быть много, у каждого много предметов и оценок. Предмет один но у него может быть много оценок у разных студентов.

В MSSMS сочинил запрос:

select Name, SurName, SUM(Rates.Rate) as 'rate'
from Students join Rates on Students.id = Rates.StudentId
group by Students.Name, Students.SurName

Он выводит табличку, которую мне нужно вывести в ASP.NET MVC. Но перевести ее в язык Linq не выходит.

Код контроллера:

private DBConnect db = new DBConnect();
public async Task<ActionResult> SumRates()
{
    var rates = db.Rates.Include(s => s.Students)
        .GroupBy(x => x.Students.Id, x => x.Rate)
        .Select(x => new { Name = x.Key, Rate = x.Sum() });

    ViewBag.SR = rates.ToList();

    return View();
}

Код View:

@foreach (var item in ViewBag.SR)
{
    <tr>
        <td>
            @item
        </td>
        <td>
        </td>

    </tr>
}

Что выводит мой код:

Что выводит мой код

Считать считает, но поделить это на таблицу или сделать вид как в MSSMS не выходит. Что делаю не так?


Ответы (1 шт):

Автор решения: Alexander Petrov

Если бы вы опубликовали код ваших сущностей и пример заполнения таблиц данными, то давно бы получили ответ. Ведь никому неохота вручную набивать тот код, который у вас уже есть.

Для начала, создадим модель, которая будет содержат нужные данные:

public class StudentRateModel
{
    public string Name { get; set; }
    public string Surname { get; set; }
    public int Rate { get; set; }
}

Навскидку, запрос должен выглядеть так:

var rates = db.Rates
    .Include(s => s.Students)
    .GroupBy(
        x => x.Students,
        (x, y) => new { Student = x, Sum = y.Sum(r => r.Rate) })
    .Select(x => new StudentRateModel
    {
        Name = x.Student.Name,
        Surname = x.Student.Surname,
        Rate = x.Sum
    });

Естественно, я его не проверял. Если приведёте необходимый код, я его протестирую.

Код во View:

<table class="table-bordered">
    <tr>
        <th>Name</th>
        <th>Surname</th>
        <th>Rate</th>
    </tr>

    @foreach (StudentRateModel item in ViewBag.SR)
    {
        <tr>
            <td>@item.Name</td>
            <td>@item.Surname</td>
            <td>@item.Rate</td>
        </tr>
    }
</table>
→ Ссылка