0

所以我在对我拥有的一些数据进行排序时遇到了一点问题。在 Telerik Grid 中,我有一个名为 Requestor 的列,它显示一个人或单位(一群人)的名称。问题是,Requestor 有两个可以从中获取数据的来源。这是两个来源。

1.) RequestorId:这是一个名为 Customer 的表的外键。在这里,我存储了用户的所有数据,包括他们的全名。顺便说一句,此字段可以为空。

2.) UnitId:这是一个名为 Units 的表的另一个外键。在这里,我存储了 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 字段。这将数据限制在两个领域。不过还有一分钟的时间来处理。

4

3 回答 3

0

所以我想出了自己的解决方案。我首先尝试了 Sławomir Rosiek 和 Gert Arnold 所做的事情。不幸的是,就像格特提到的那样,第一个答案不会通过。第二个也有类似的问题。

最后,我创建了一个类来存储来自请求者和单元的数据。它包括以下内容:

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 秒。这并不完美,但比以前好多了。感谢所有的帮助。

于 2013-02-15T18:44:03.807 回答
0

你有没有尝试过这样的事情:

return _purchaseOrders.GetPurchaseOrders().Select(i => new 
{
     OrderColumn = i.requestorId != null ? purchaseOrder.Requestor.Fullname : purchaseOrder.unit.Fullname,
     // map other columns
})
.OrderBy(i => i.OrderColumn);
于 2013-02-14T19:56:57.633 回答
0

有点像 Sławomir Rosiek 的解决方案(但实体框架不会接受该声明):

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

(因为您不再使用 RequestName 了)。

尤其是当GetPurchaseOrders()来自IQueryableEF 时,您将排序委托给数据库引擎,因为排序表达式成为 SQL 语句的一部分。

于 2013-02-14T20:26:20.017 回答