2016-05-03 62 views
0

當排序依據列是父表做以下我所說動態排序表中的行... 在孩子使用實體框架動態排序列

public List<ServiceRequest> SortSRsByParentFields(string p_Criteria, 
                bool p_sortDescending, 
                bool p_ShowAll = true) { 

    var propertyInfo = typeof(ServiceRequest).GetProperty(p_Criteria); 
    var sortedList1 = new List<ServiceRequest>(); 
    var sortedList2 = new List<ServiceRequest>(); 

    var myServiceRequests = GetMyServiceRequests(); 
    var otherServiceRequests = GetOthersServiceRequests(); 

    if (p_sortDescending) 
    { 
     sortedList1 = myServiceRequests 
     .AsEnumerable() 
     .OrderByDescending(x => propertyInfo.GetValue(x, null)).ToList(); 

     sortedList2 = otherServiceRequests.AsEnumerable() 
     .OrderByDescending(x => propertyInfo.GetValue(x, null)) 
     .ThenBy(x => x.Client.LastNameFirst).ToList(); 
    } 
    else 
    { 
     sortedList1 = myServiceRequests.AsEnumerable() 
     .OrderBy(x => propertyInfo.GetValue(x, null)).ToList(); 
     sortedList2 = otherServiceRequests.AsEnumerable() 
     .OrderBy(x => propertyInfo.GetValue(x, null)) 
     .ThenBy(x => x.Client.LastNameFirst).ToList(); 
    } 

    var allSRs = p_ShowAll == false ? sortedList1.Concat(sortedList2).Take(1000) 
     .ToList() : sortedList1.Concat(sortedList2).ToList(); 
    return allSRs; 
    } 

但我不能似乎使這個方法工作,如果orderby列在一個子表(一個通過FKey與父代相關的表)。

所以問題是我該如何做到這一點?

回答

0

EF並沒有真正爲動態排序而設計。但是,您可以使用其他替代方案來替代其他EF代碼。

例如,Tortuga Chain你可以寫:

ds.From("ServiceRequests", [filter]).WithSorting (new SortExpression(p_Criteria, p_sortDescending)).ToCollection<ServiceRequest>().Execute(); 

您也可以只需直接生成SQL,但是因爲你必須仔細檢查排序表達式,以確保它,我不推薦這種做法實際上是列名稱而不是SQL注入攻擊。