2013-02-14 51 views
0

所以我有一個問題,在排序我有一些數據。在Telerik Grid中,我有一個名爲Requestor的列,顯示一個人或單位(一羣人)的名字。問題是,Requestor有兩個來源可以從中獲取數據。這是兩個來源。排序數據問題

1.)RequestorId:這是一個名爲Customer的表的外鍵。在這裏,我存儲了用戶的所有數據,包括他們的全名。此字段可以爲空btw。

2.)UnitId:這是稱爲Units的表的另一個外鍵。在這裏,我儲存了單位的所有數據,特別是他們的名字。此字段可以爲空btw。

這裏的邏輯:

//Entity class that contains all the data for my grid 
var purchaseOrders = _purchaseOrders.GetPurchaseOrders(); 

//Key is Id of PurchaseOrders, Value is name of requestor 
var dictionary = new Dictionary<int, string>(); 

foreach (var purchaseOrder in purchaseOrders) 
{ 
if (purchaseOrder.requestorId != null) 
    dictionary.add(purchaseOrder.Requestor.Fullname); 
else 
    dictionary.add(purchaseOrder.unit.Fullname); 
} 

dictionary.orderby(x => x.value).ToDictionary(x => x.Key, x.Value); 
var tempPurchaseOrders = new List<PurchaseOrder>(); 

foreach (var item in dictionary) 
{ 
    tempPurchaseOrders.Add(purchaseOrders.Where(x => x.Id == item.Key).FirstOrDefault()); 
} 

purchaseOrders = tempPurchaseOrders.AsQueryable(); 
return purchaseOrders; 

這個邏輯返回基於什麼我想做的事,然而,問題是它需要處理時間量的有序列表。處理需要1分鐘。顯然這太可怕了。無論如何要優化這個嗎?在我返回電網後,我減少了電源,因爲事先沒有合理的方法來切斷它。

任何幫助,將不勝感激。謝謝。

編輯:我發現我不再需要使用RequestName字段。這將數據限制在兩個方面。儘管如此,還需要一分鐘。

+0

你要排序多少數據? – 2013-02-14 19:42:03

+0

當前13.2k條記錄。一旦完成我的項目,我會有更多的傳入。最有可能的是另外1K左右,但是,我仍然想盡我所能平穩一切。 – IyaTaisho 2013-02-14 19:48:13

+0

'dictionary.add'(小寫)?有一個論點?關鍵是什麼?你知道瓶頸在哪裏嗎?這不一定是排序。 – 2013-02-14 20:03:28

回答

0

所以我想出了我自己的解決方案。我第一次嘗試了SławomirRosiek和Gert Arnold做了什麼。不幸的是,就像格特所說的那樣,第一個答案是不會通過的。第二個有類似的問題。

最後,我創建了一個類來存儲來自Requestors和Units的數據。它包括以下內容:

internal class RequestorData 
{ 
    public int entityId { get; set; } 
    public string Name { get; set; } 
    public bool isRequestorId { get; set; } 
} 

接下來,我做了以下。

//Entity class that contains all the data for my grid 
var purchaseOrders = _purchaseOrders.GetPurchaseOrders(); 
var tempPurchaseOrders = new List<PurchaseOrder>(); 
var requestors = new List<RequestorData>(); 
var customers = purchaseOrders.Select(po => po.Requestor).Distinct().ToList(); 
var units = purchaseOrders.Select(po => po.Unit).Distinct().ToList(); 

foreach (var customer in customers) 
{ 
    if (customer != null) 
     requestors.Add(new RequestorData { entityId = customer.Id, Name = customer.FullName, isRequestorId = true }); 
} 
foreach (var unit in units) 
{ 
    if (unit != null) 
    requestors.Add(new RequestorData { entityId = unit.Id, Name = unit.FullName, isRequestorId = false }); 
} 

requestors = requestors.OrderBy(r => r.Name).ToList(); 

foreach (var requestor in requestors) 
{ 
    var id = requestor.entityId; 
    if (requestor.isRequestorId) 
     tempPurchaseOrders.AddRange(purchaseOrders.Where(po => po.RequestorId == id).ToList()); 
    else 
     tempPurchaseOrders.AddRange(purchaseOrders.Where(po => po.UnitId == id).ToList()); 
} 

purchaseOrders = tempPurchaseOrders.AsQueryable(); 
return purchaseOrders; 

我跑了這個新的翻譯,並有5-6秒的等待時間。這並不完美,但比以前好多了。感謝所有的幫助。

0

您是否嘗試過這樣的事情:

return _purchaseOrders.GetPurchaseOrders().Select(i => new 
{ 
    OrderColumn = i.requestorId != null ? purchaseOrder.Requestor.Fullname : purchaseOrder.unit.Fullname, 
    // map other columns 
}) 
.OrderBy(i => i.OrderColumn); 
0

有點像斯瓦沃米爾Rosiek的解決方案(但實體框架不會接受這種說法):

return _purchaseOrders.GetPurchaseOrders() 
         .OrderBy(o => o.unit.Fullname).ToList(); 

(因爲你不知道再次使用RequestName)。

尤其是當GetPurchaseOrders()是來自EF的IQueryable時,您將排序委託給數據庫引擎,因爲排序表達式成爲SQL語句的一部分。