0

ですから、私が持っているいくつかのデータを並べ替えるのに少し問題があります。Telerikグリッドには、個人またはユニット(人々のグループ)の名前を表示するRequestorという列があります。問題は、リクエスターにはデータを取得できる2つのソースがあることです。これが2つの情報源です。

1.)RequestorId:これはCustomerというテーブルへの外部キーです。ここでは、フルネームを含むユーザーのすべてのデータを保存します。このフィールドはnullになる可能性があります。

2.)UnitId:これはUnitsと呼ばれるテーブルへのもう1つの外部キーです。ここでは、ユニットのすべてのデータ、特に名前を保存します。このフィールドはnullになる可能性があります。

ロジックは次のとおりです。

//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フィールドを使用する必要がなくなったことがわかりました。これにより、データは2つの領域に制限されます。ただし、処理にはまだ1分かかります。

4

3 に答える 3

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ławomirRosiekのソリューションに少し似ています(ただし、エンティティフレームワークはそのステートメントを受け入れません):

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

(RequestNameを使用しなくなったため)。

特に、GetPurchaseOrders()IQueryableEFからの場合、ソート式はSQLステートメントの一部になるため、ソートをデータベースエンジンに委任します。

于 2013-02-14T20:26:20.017 に答える
0

だから私は自分の解決策を思いついた。私は最初にSławomirRosiekとGertArnoldの両方が行ったことを試しました。残念ながら、Gertが述べたように、最初の答えは通過しませんでした。2つ目も同様の問題がありました。

最後に、リクエスターとユニットの両方からのデータを格納するクラスを作成しました。それは以下で構成されていました:

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 に答える