簡體   English   中英

具有內部表達式的OrderBy linq的表達式

[英]Expression for OrderBy linq with inner expression

我有以下表達方式進行排序:

this.Students = this.Students.OrderBy(x => x.ExamData.OrderByDescending(p => p.ExamDate).ThenByDescending(p => p.ExamId).FirstOrDefault().TotalMarks);

雖然我的想法是抽象表達式

x => x.ExamData.OrderByDescending(p => p.ExamDate).ThenByDescending(
                                  p => p.ExamId).FirstOrDefault().TotalMarks

作為一個lambda表達式,以便我可以使用像

this.Students = this.Students.OrderBy(sortExpression);

這是因為我有許多排序字段,如上面定義的TotalMarks,我想從排序字段創建表達式,然后調用OrderBy。

我知道從這個鏈接 ,我們可以創建一個表達式,其中使用了child屬性,但沒有使用內部表達式。

目前我已經給出了一個開關盒,並在每種情況下都寫了相同的東西

this.Students = this.Students.OrderBy(x => x.ExamData.OrderByDescending(p => p.ExamDate).ThenByDescending(p => p.ExamId).FirstOrDefault().SubjectName);

所以我的想法是使用靜態方法創建Expressionofilder,該方法構建傳遞fieldName的表達式,如

public static Expression BuildSortExpression(string fieldName) {}

您可以輕松地將大部分邏輯拉入方法:

private int sortExpression(Student x) { 
    return x.ExamData.OrderByDescending(p => p.ExamDate).ThenByDescending(p => p.ExamId).FirstOrDefault().TotalMarks;
}

假設TotalMarks是一個int

然后你只需要使用:

this.Students.OrderBy(x => sortExpression(x));

或將其添加為學生的財產。

警告:如果您使用ORM(linq to SQL,Entity框架等),這將不會像以前的代碼那樣高效執行!

嘗試創建一個可重用的表達式變量最終會比創建自己的擴展方法以完成整個排序要多得多:

public static IQueryable<Student> OrderByMarks(this IQueryable<Student> students)
{
    return students.OrderBy(student => student.ExamData
        .OrderByDescending(exam => exam.ExamDate)
        .ThenBy(exam => exam.ExamId)
        .FirstOrDefault().TotalMarks);
}

然后你可以像這樣使用它:

this.Students = this.Students.OrderByMarks();

使用Ben的想法得到了解決方案。 創建了一個

Dictionary<string, Func<Student, Object>>

將排序字段作為鍵,將func作為

new Func<Student, object>((Student student) => { return GetLatestExam(student).TotalMarks; })

和GetLatestExam靜態方法一樣

private static Study GetLatestExam(Student student)
{
     return student.ExamData.OrderByDescending(p => p.ExamDate).ThenByDescending(p => p.ExamId).FirstOrDefault();
}

然后在實際排序中,我只需要這樣調用:

public void Sort(string sortField, bool sortAscending)
{
     // based on the sort field, get the sorting expression and execute.
     if(sortAscending)
     {
          this.Students= this.Students.OrderBy(student=>this._customSortColumns[sortField](student));
     }
     else
     {
          this.Patients = this.Patients.OrderByDescending(student=>this._customSortColumns[sortField](student));
     }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM