複数の顧客を持つことができるMultiSelectFor列を持つ剣道UI MVCコアオーダーグリッドがあります。すべて正常に動作していますが、2000を超えるレコードがあるので、多対多テーブルからフェッチする必要がある関連するデータがあるため、リストを表示するには時間がかかりすぎます。ビューモデルによる関連データクエリの最適化
私はデータベースを最初にEFで使用していますので、dbモデルを足場にします。
public partial class Orders
{
public Orders()
{
OrdersCustomers = new HashSet<OrdersCustomers>();
}
public int JobNo { get; set; }
public ICollection<OrdersCustomers> OrdersCustomers { get; set; }
}
マイビューモデルOrdersVM(ビューモデル)::ここで
はEF(私は不要なコードを削除した)によって生成されたOrdersテーブルのモデルである
public class OrdersVM
{
public int JobNo { get; set; }
[UIHint("OrdersCustomersET")]
[Required(ErrorMessage = "A Customer is required")]
public IEnumerable<OrdersCustomersVM> OrdersCustomers { get; set; }
}
EFはOrdersCustomersコードを生成しました:
public partial class OrdersCustomers
{
public int JobNo { get; set; }
public string ClientId { get; set; }
public Customers Client { get; set; }
public Orders JobNoNavigation { get; set; }
}
マイOrdersCustomersビューモデル:
私はそれが非常に多くのSQLクエリを持ってしても意味がありませんので、キャッシュなどのいずれかで私のコードを最適化したいと思いpublic IActionResult Read([DataSourceRequest] DataSourceRequest request)
{
var List = _context.Orders
.Select(c => new OrdersVM
{
JobNo = c.JobNo,
OrdersCustomers = c.OrdersCustomers.Select(t => new OrdersCustomersVM
{
ClientId = t.ClientId,
ClientName = t.Client.ClientName
}),
}).OrderByDescending(c => c.JobNo).Where(r =>r.OfficeId == _getempinfo.GetOID(User.Identity.Name);
return Json(List.ToDataSourceResult(request));
}
(私はSQL Serverのプロファイラでそれを見ることができます):
public class OrdersCustomersVM
{
public int JobNo { get; set; }
public string ClientName { get; set; }
public string ClientId { get; set; }
}
私のコントローラを。
私の剣道グリッドは、Ajaxのバッチ(真の)スネルタイプのグリッドです。