2013-02-14 3 views
0

Итак, у меня есть небольшая проблема при сортировке данных, которые у меня есть. В сетке Telerik у меня есть столбец «Requestor», в котором отображается имя человека или группы (группа людей). Проблема заключается в том, что у Requestor есть два источника, из которых он может получить свои данные. Вот два источника.Проблема сортировки данных

1.) RequestorId: Это внешний ключ к таблице Customer. Здесь я храню все данные для пользователя, включая их полное имя. Это поле может быть нулевым.

2.) UnitId: Это другой внешний ключ для таблицы под названием Units. Здесь я храню все данные для единиц, особенно их имена. Это поле может быть нулевым.

Вот логика:

//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

Сколько данных вы сортируете? –

+0

В настоящее время записи 13,2 тыс. Записей. У меня есть больше входящих, как только я завершу свой проект. Скорее всего, еще 1k или около того, но все же, я хочу сгладить все, что могу. – IyaTaisho

+0

'dictionary.add' (нижний регистр)? С одним аргументом? Каков ключ? И знаете ли вы, где узкое место? Это не обязательно сортировка. –

ответ

0

Итак, я придумал свое решение. Сначала я попробовал то, что сделал и Славомир Розиек и Герт Арнольд. К сожалению, как сказал Герт, первый ответ не пройдет. У второго были подобные проблемы.

В конце концов, я создал класс для хранения данных как из запросов, так и из блоков. Он состоял из:

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

Немного как решение Sławomir Rosiek в (но рамки сущности не будет принимать это заявление):

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

(так как вы не используйте RequestName больше).

Особенно, если GetPurchaseOrders() является IQueryable от EF, вы делегируете сортировку в базу данных, потому что выражение sort становится частью инструкции SQL.

Смежные вопросы