2013-02-14 52 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语句的一部分。