Как в Linq сделать выборку по рангу в зависимости от проверки введенного параметра?
У меня есть таблицы Questions, Answers, QuestionsTopic и Rangs. Каждый вопрос имеет свой ранг и может быть несколько вопросов одного ранга. Вопросы принадлежат своей теме-топику. То есть, например, тема Сложение. Вопросы 1 ранга - 2+2 (внутри ранга присваивается номер 1), 3+3 (номер 2). Вопросы 2 ранга - 50+97 (номер 1) и т.д. То же самое повторяется и в других темах.
Мне нужно выводить вопросы, группированные по темам и сначала 1 ранга. Потом после проверки на ответы должны выводится другие вопросы в зависимости от данных ответов. Если ответ был дан правильный - ранг вопроса повышается и выдается вопрос 2 ранга, если неправильный - ранг остается прежним и выдается вопрос того же 1 ранга, но со следующим внутриранговым присвоенным номером.
Параметр, куда сохраняется ответ от пользователя хранится в таблице Questions, поэтому его апдейтю.
P.S.: класс Entity - класс, где храню id для всех моделек
public class Questions:Entity
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
/// <summary>
/// Внешний ключ
/// </summary>
public long QuestionTopcId { get; set; }
public QuestionsTopic QuestionsTopic { get; set; } // навигационное свойство
/// <summary>
/// Внешний ключ
/// </summary>
public long RangsId { get; set; }
public Rangs Rangs { get; set; } // навигационное свойство
/// <summary>
/// Внутренний ключ вопроса среди одного ранга
/// </summary>
public int NumberQuest { get; set; }
/// <summary>
/// Сам вопрос
/// </summary>
public string ValueQuest { get; set; }
public Answers Answers { get; set; } //навигационное свойство
/// <summary>
/// Ответ ученика
/// </summary>
[Required(ErrorMessage = "Укажите ответ на вопрос")]
public string StudentAnswer { get; set; }
/// <summary>
/// Проверка ответа
/// </summary>
public bool? CheckAnswer { get; set; }
/// <summary>
/// Проверка на пройденность вопроса
/// </summary>
public bool IsUsed { get; set; } = false;
public virtual ICollection<Users> Users { get; set; }
public Questions()
{
Users = new List<Users>();
}
}
public class Answers:Entity
{
/// <summary>
/// Внутренний ключ ответа среди одного ранга
/// </summary>
public int NumberAnswer { get; set; }
/// <summary>
/// Сам ответ
/// </summary>
[Required]
public string ValueAnswer { get; set; }
/// <summary>
/// внешний ключ таблицы Questions
/// </summary>
[ForeignKey("QuestionId")]
public long QuestionId { get; set; }
public Questions Questions { get; set; }
}
public QuestionsController(SaitDbContext context)
{
db = context;
}
/// <summary>
/// Вывод вопросов
/// </summary>
[HttpGet]
public async Task<IActionResult> Index()
{
var question = db.Questions.Where(r => r.IsUsed == false).Select(x => new
{
id = x.Id,
IdTopic = x.QuestionTopcId,
NumberQuest = x.NumberQuest,
ValueQuest = x.ValueQuest,
IsUsed = x.IsUsed,
RandId = x.RangsId
}).AsEnumerable().GroupBy(x => x.IdTopic);
List<Questions> quest_list = new List<Questions>();
foreach (var item in question)
{
Questions quest = new Questions();
quest.Id = item.ToList()[0].id;
quest.QuestionTopcId = item.ToList()[0].IdTopic;
quest.NumberQuest = item.Select(c => c.NumberQuest).First();
quest.ValueQuest = item.Select(c => c.ValueQuest).First();
quest.RangsId = item.ToList()[0].RandId;
quest_list.Add(quest);
}
return View(quest_list);
}
public async Task<IActionResult> Edit(long? id)
{
if (id == null)
{
return NotFound();
}
var quest = await db.Questions.FindAsync(id);
if (quest == null)
{
return NotFound();
}
return View(quest);
}
// POST: Answers/Edit/5
// To protect from overposting attacks, enable the specific properties you want to bind to, for
// more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
[HttpPost]
[ValidateAntiForgeryToken]
public async Task<IActionResult> Edit(long id, [Bind("StudentAnswer,IsUsed,Id")] Questions quest)
{
if (id != quest.Id)
{
return NotFound();
}
if (ModelState.IsValid)
{
try
{
Answers answ = db.Answers.Where(x => x.QuestionId == quest.Id).FirstOrDefault();
Questions dataModel = db.Questions.Where(x => x.Id == quest.Id).FirstOrDefault();
dataModel.StudentAnswer = quest.StudentAnswer;
dataModel.IsUsed = true;
if (answ.ValueAnswer == dataModel.StudentAnswer)
{
dataModel.CheckAnswer = true;
}
else
{
dataModel.CheckAnswer = false;
}
await db.SaveChangesAsync();
}
catch (DbUpdateConcurrencyException)
{
if (!QuestionsExists(quest.Id))
{
return NotFound();
}
else
{
throw;
}
}
return RedirectToAction(nameof(Index));
}
return View(quest);
}
private bool QuestionsExists(long id)
{
return db.Questions.Any(e => e.Id == id);
}