@User99

Как сделать циклический запрос к базе данных?

Не могу сделать циклический запрос к базе данных, например в делфи можно так
var i:int;
......
TQuery1.first;
for i:=0 to Tquery1.RecordCount -1 do // то есть выполняется запрос пока не кончится все записи в таблице
begin
TQuery2.Close;
TQuery2.SQL.Text:='SELECT * FROM tablica WHERE PREDMET='''+TQuery1PREDMET.Value+'''';
Tquery2.ExecSQL;
Tquery1.Next;
end;

Таблица TQuery2 выполняет запрос к другой таблице по всем записям в таблице TQuery1, столбец PREDMET. Как такое можно реализовать в asp.net? или есть другой вариант? В общем есть такая задача
Есть таблица с названиями предметов Predmets, и есть таблица с оценками, датами Balls. таблица Balls связан с Predmets один ко многим (PredmetId). Мне надо вывести так 5acdf4bbeef89574470072.jpeg

Предметы в одиночку нормально выводиться, как надо. Теперь не могу вывести всех предметов одним списком в один views
  • Вопрос задан
  • 288 просмотров
Решения вопроса 1
@kttotto
пофиг на чем писать
Небольшие замечания:
1. Перед тем как копировать сюда код, лучше его скопипастить в блокнот, там его отформатировать (удалить слева лишние табы), а потом только из блокнота копипастить сюда. Тяжело воспринимать плохо отформатированный код, особенно когда его много.
2. Очень тяжело читать код с непонятными наименованиями. Лучше придерживаться традиции именования на нормальном английском языке. Закрепите в браузере страницу с гугл переводчиком и при необходимости перевести на английский - дело пары секунд. Никаких сокращений, поля в моделях - только первая буква большая. Некоторые наименования я так и не понял, что Вы ими обозначили.
3. Преподаватель предмета, это пользователь, значит и привязывать надо не по его имени, а по его Id. Вместо
var jlist = db.Jpredmets.Where(j => j.PREPODIIN == User.Identity.Name).ToList();

лучше
var lessons = db.Lessons.Where(j => j.TeacherId == User.Id).ToList();

4. Дальше пытаюсь разобраться, что и как Вы хотите найти
var pr = db.Jpredmets.FirstOfDefault(gr => gr.ID == id).GR;

Что такое GR я так и не понял. Можно подумать, что сущность группы, но он string. Имя группы? Каждый предмет привязан к конкретной группе?

Мой вариант как должно быть
var group = db.Lessons.Find(l => l.Id == id).Group;

где Group - сущность, которая связана с lesson как один-ко-многим. Примерная модель
public class Group
{
	public int Id { get; set; }
	public string Name { get; set; }    // название группы
	public ICollection<Lesson> Lessons { get; set; }    // предметы
	public ICollection<Learner> Learners { get; set; }  // ученики
}

var kont = db.Kontingents.Where(k => k.GRUPPA == pr).ToList();

Что такое kontingents? Ученики? Тогда мой вариант выглядел бы так
var learners = db.Learners.Where(k => k.GroupId == group.Id);

var jocenki = db.Jpredmets.Include(t => t.Jjours).FirstOrDefault(t => t.ID == id);

Чтотако Jjours я даже интуитивно догадаться не смог. Судя по модели, это сущность которая хранит в себе оценку, дату, когда ее поставили и т.д. Но результат Вы назвали jocenki, а оценок там не будет. Там будут предметы в которых сразу же будут подтянуты данные о Jjours. И вы опять находите предмет, который уже нашли, когда искали группу. Можно было сделать так
var lesson = db.Lessons.Find(l => l.Id == id).Include(t => t.Jjours);
var group = lesson.Group;

Дальше я предполагаю, что должно быть так
var jour = new Journalsliv();
jour.Learners = learners;
jour.Jjoursliv= group.Jjours;

Это все можно было упростить, сделав так
var group = db.Lessons.Find(l => l.Id == id).Include(t => t.Jjours).Group;
var jour = new Journalsliv
{
	Learners = db.Learners.Where(k => k.GroupId == group.Id).ToList(),
	Jjoursliv = group.Jjours.OrderBy(j => j.Date).ToList()  // на всякий случай сортируем по дате
}

5. Ну и по выводу на клиенте. Я не знаю, как у Вас в задании, но выводить даты в ширину, это будет жестоко, если их надо будет вывести за достаточно длительный период. В общем дат может быть бесконечно, а кол-во учеников всегда ограничено. Я бы сделал наоборот: ученики - поля (в ширину), а даты - записи ( в длину).

Ну и главная ошибка у Вас в этом коде
@foreach (var roc in Model.Jjoursliv)
{
    <tr>
        <td>@roc.IIN</td>
        @foreach (var roc2 in Model.Jjoursliv)
        {
            <td>@roc2.OCENKA</td>
        }
    </tr>
}

Мне совсем не понятна логика хранения оценок, раз Вы пытаетесь их таким способом достать. Судя по Вашему коду Jjoursliv это коллекция Jjour, а Jjour - это одна оценка для одного ученика. И кодом выше Вы для каждого ученика выводите оценки других учеников, т.е. для каждого вы выведе одну и туже последовательность оценок других учеников, вот они у Вас и выглядят одинакого.
Вам нужно сначала сгруппировать все оценки по имени
var learners = Model.Jjoursliv.GroupBy(j => j.IIN)
Так Вы получите коллекцию учеников, которая будет сосотоять из коллеции оценок.
И тогда это можно вывести так
@foreach (var learner in learners)
{
    <tr>
        <td>@learner.First().IIN</td>
        @foreach (var jour in learner)
        {
            <td>@jour.OCENKA</td>
        }
    </tr>
}

Резюмируя, хочу порекомендовать: разобраться повнимательней что делает Include и как работает ToList() и в каких случаях он нужен; пересмотреть структуру бд, есть ошибки, поэтому возникли сложности с пониманием как нужно делать выборку.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы