ArfatM Ответов: 1

Запрос Linq для получения ранга на основе b


в базе данных идентификатор пользователя 1022 завершил 2 единиц( идентификационный номер:100 и 101) ID пользователя 1021 завершена 3 единицы (ИД:100,101,102) если я передаю имя пользователя (1022)столбцами courseid(109) семафоров semid(3000) subjectid(2006), то результат shoild быть средней scoredmarks/totalmarks * 100, что составляет 77,5 и ранг User1022 1 и пользователей 1021 ранг Б 2





В приведенном ниже коде при близком возврате я получаю ошибку вместо этого оператора return мне нужен один запрос для достижения вышеуказанных критериев

Что я уже пробовал:

public GetCalculatePerform(int? Student_ID, int? CourseID, int? SemID, int? SubjectID)
        {
            var scoreCard = dbcontext.Stu_Result
            .Where(u => u.CourseID == CourseID && u.SemID == SemID && u.SubjectID == SubjectID);
return scoreCard.GroupBy(u => u.UserID).OrderByDescending(g => g.Average(u => u.ScoredMarks / u.TotalMarks * 100)).Select
                 ((g, i) => new UserRankObject
                 {
                     UserId = (int)g.Key,
                     Rank = i + 1,
                     AverageScore = g.Average(u => u.ScoredMarks / u.TotalMarks * 100)
                 }).Single(u => u.UserId == Student_ID);


        }


RID   UserID  CourseID    SemID   SubjectID   UnitID  ScoredMarks TotalMarks  No_Attempts               CreatedDate ModifiedDate
  1     1021       109     3000        2006      100           30       100             1   2019-02-12 00:00:00.000 NULL
  2     1021       109     3000        2006      101           40       100             1   2019-02-18 00:00:00.000 NULL
  3     1021       109     3000        2006      102           85       100             1   2019-02-19 00:00:00.000 NULL
  4     1022       109     3000        2006      101           80       100             1   2019-02-19 00:00:00.000 NULL
  5     1022       109     3000        2006      100           75       100             1   2019-02-19 00:00:00.000 NULL

1 Ответов

Рейтинг:
8

Maciej Los

Попробовать это:

var scoreCard = dbcontext.Stu_Result
        .Where(u => u.CourseID == CourseID && u.SemID == SemID && u.SubjectID == SubjectID)
        .GroupBy(u => u.UserID)
        .OrderByDescending(grp=>grp.Average(u => u.ScoredMarks))
        .Select((grp, i) =>new
             {
                 UserId = grp.Key,
                 Rank = i+1,
                 AverageScore = grp.Average(u => u.ScoredMarks)
             })
        .ToList();


Для лица, попробуйте этот:

var scoreCard = dbcontext.Stu_Result
        .Where(u => u.CourseID == CourseID && u.SemID == SemID && u.SubjectID == SubjectID)
        .ToList() //the magic is here!
        .GroupBy(u => u.UserID)
        .OrderByDescending(grp=>grp.Average(u => u.ScoredMarks))
        .Select((grp, i) =>new
             {
                 UserId = grp.Key,
                 Rank = i+1,
                 AverageScore = grp.Average(u => u.ScoredMarks)
             })
        .ToList();


ArfatM

после того, где условие ; есть ли, как вы добавляете .Группа По.....??????


Message=LINQ to Entities не распознает метод ' System.Linq.IQueryable`

Maciej Los

Вы не упомянули, что это запрос EF.

ArfatM

это работает. Но у меня другой сценарий

Например: если Пользователь1 завершает экзамен по Unitid: 100,101 и 102 и если пользователь2 завершает экзамен по UnitID 100 и 101.
Если я проверяю ранг и средний балл пользователя 2, то он должен сопоставить завершенные единицы пользователя 1, которые равны 100 и 101, а не 102.

Maciej Los

Итак... вы хотите найти пользователей с общими единицами измерения...
Такой запрос немного сложнее. Мне нужно несколько дней, и я постараюсь вам помочь. До понедельника я занят. Пожалуйста, наберитесь терпения.

ArfatM

Чувак ... ты уже закончил с этим ?

Maciej Los

Нет. Я все еще занят. Я дам тебе знать, когда закончу. Или... вы можете задать другой вопрос. Здесь должен быть кто-то, кто может вам помочь.

ArfatM

это работает. Но у меня другой сценарий

Например: если Пользователь1 завершает экзамен по Unitid: 100,101 и 102 и если пользователь2 завершает экзамен по UnitID 100 и 101.
Если я проверяю ранг и средний балл пользователя 2, то он должен сопоставить завершенные единицы пользователя 1, которые равны 100 и 101, а не 102.

ArfatM

Да спасибо