У меня есть таблицы А именно StudentInfo и ScoreInfo

Таблица: DbSet<StudentInfo>

ID    Name
_____________________
1     Ram
2     Kumar

Таблица: DbSet<ScoreInfo>

Id    StudentId    Subject    Score
_____________________________________
1     1            GK         90
2     1            PHY        97
3     1            CHE        89
4     1            BIO        93
5     1            TAM        100
6     1            ENG        95
7     2            GK         85
8     2            PHY        76
9     2            CHE        63
10    2            BIO        79
11    2            TAM        61
12    2            ENG        60

Запрос Linq to SQL (IQueryable)

using(var db = new DBContext()) {
    IQueryable<ScoreInfo> resultQuery = db.ScoreInfos.OrderBy(????)
      .Take(5)
}

Порядок по логике

((m.Subject == "GK") || (m.Subject == "PHY") (m.Subject == "CHE") || (m.Subject == "BIO"))
    ? "Science"
    : "Arts"

Результат возврата LINQ to SQL должен быть (ожидается)

Id    StudentId    Subject    Score
_____________________________________
5     1            TAM        100
6     1            ENG        95
11    2            TAM        61
12    2            ENG        60
1     1            GK         90

Переменная sortColumn является столбцом предположений, основанным на логике сортировки, которая была указана выше. Пожалуйста, помогите мне, как написать Expression<Func<ScoreInfo,object>>, т.е. OrderBy(Expression<Func<ScoreInfo,object>>)?

1
user7784919 27 Май 2017 в 21:03

2 ответа

Лучший ответ

Вы можете сделать ту же логику в предложении Order By

var science = new HashSet<string> { "GK", "PHY", "CHE", "BIO" };

IQueryable<ScoreInfo> score = db.ScoreInfos
    .OrderBy(m => science.Contains(m.Subject) ? "S" : "A")
    .ThenBy(x => x.Id)
    .Take(5);
1
B.Balamanigandan 28 Май 2017 в 04:53

Вы можете попробовать что-то вроде следующего:

var scienceSubjects = new HashSet<string> { "GK", "PHY", "CHE", "BIO" };

using(var db = new DBContext()) 
{
    var resultQuery = db.ScoreInfos
                        .Select(scoreInfo => new 
                        {
                            ScoreInfo = scoreInfo,
                            GrpId = scienceSubjects.Contains(scoreInfo.Subject) ? 0 : 1
                        })
                        .OrderByDescending(x=>x.GrpId)
                        .ThenByDescending(x=>x.ScoreInfo.Score)
                        .Select(x=>x.ScoreInfo)
                        .Take(5);
}

По сути, мы разделили предметы на две категории с идентификаторами 0 для научных предметов и 1 для остальных. Затем мы упорядочиваем их в порядке убывания на основе идентификатора категории, чтобы мы сначала получили объект, не относящийся к науке. Позже мы упорядочиваем их в порядке убывания на основе информации о баллах, чтобы мы сначала получили самые высокие баллы. Наконец мы подбираем 5 записей, которые нас интересуют.

Здесь вы найдете .net fiddle, где проверено вышеизложенное.

0
Christos 27 Май 2017 в 21:30