Как в 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);
        }

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