2017-05-27 2 views
1

Ich bin nämlich StudentInfo ein Tabellen mit und ScoreInfoLINQ to SQL SortiertNach für eine hartcodierte Zeichenfolge in C# unter Verwendung des Ausdrucks

Tabelle: DbSet<StudentInfo>

ID Name 
_____________________ 
1  Ram 
2  Kumar 

Tabelle: 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 

Die Linq zu SQL-Abfrage (IQueryable)

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

Die Order By Logic ist

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

Die LINQ to SQL Rückgabeergebnis sollte (Erwartete) werden

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

Die Variable sortColumn ist eine Annahme, Spalte für die Sortierlogik basiert, die angegeben wurde in oben. Bitte helfen Sie mir, wie man die Expression<Func<ScoreInfo,object>> schreibt, d. H., OrderBy(Expression<Func<ScoreInfo,object>>)?

+0

Hallo die gleiche Logik tun, ich habe nicht Ihre Bestellung durch Logik. Wie es scheint, möchten Sie die Themen GK, PHY, CHEC und BIO berücksichtigen. Warum verwenden Sie den bedingten Operator, um sie in Wissenschaft und Kunst zu trennen? Wie kann dies in der Bestellung von verwendet werden? Dies ist, wo ich dich nicht bekommen kann. Was nimmst du am liebsten in den Fächern GK, PHY, CHEC und BIO? Das ist ziemlich einfach, ich kann Ihnen erklären, dass Sie das können. Die erwartete Ausgabe zeigt jedoch nicht, dass dies das ist, wonach Sie suchen. Bitte geben Sie klarer an, was Ihre Kriterien in Englisch sind (ohne Codebeispiel). Danke – Christos

+0

@Christos - Zuerst brauche ich die Aufzeichnungen von ENG und TAM, dann den Rest der nicht-sprachlichen Fächer wie GK, PHY, CHEM und BIO. Also, in den 12 Aufzeichnungen 4 Datensätze enthalten ENG oder TAM außerdem mache ich die Paginierung Arbeit so 4 Datensätze von ENG/TAM und 1 Wissenschaft bezogenen Rekord. –

+0

Das riecht nach Hausaufgaben. Sie können bedingte Ausdrücke in der Reihenfolge schreiben wie 'd.Subject ==" TAM "|| d.Subject == "EN"? 0: (d.Subject == "Etwas anderes"? 1: 2; "sie haben übersetzt in den Fall dann in sql –

Antwort

1

Sie können in ORDER BY-Klausel

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); 
0

Man könnte so etwas wie das folgende versuchen:

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); 
} 

Im Wesentlichen teilen wir die Themen in zwei Kategorien mit ids 0 für den naturwissenschaftlichen Fächern und 1 für den Rest von ihnen. Dann ordnen wir sie in absteigender Reihenfolge auf der Basis der Kategorie-ID an, damit wir zuerst das nicht-wissenschaftliche Objekt haben. Später bestellen wir sie in absteigender Reihenfolge basierend auf den Score-Informationen, damit wir zuerst die höchsten Punktzahlen haben. Zuletzt holen wir die 5 Datensätze ab, an denen wir interessiert sind.

Here Sie finden eine .net Geige, wo das Obige getestet wird.