0

複数の顧客を持つことができる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のバッチ(真の)スネルタイプのグリッドです。

答えて

0

インターフェイスを作成することによって、クエリは自動的に最適化されます。 Asp.net Core/EF Coreの専門家ではない人が、なぜこれを行うのか説明することができます。

クエリがコントローラ内にある場合、ページは各行に対して個別のクエリを作成するため、データを返すのに32秒かかります。

クエリがインターフェイス経由で実行される場合、947ミリ秒かかります。次に、コントローラに

public interface IOrdersService 
{ 
    IEnumerable<Orders> GetAll(); 
} 

public IEnumerable<Orders> GetAll() 
    { 
     return _context.Orders.AsNoTracking().Include(o => o.OrdersCustomers).ThenInclude(o =>o.Client); 

    } 

public IActionResult Read([DataSourceRequest] DataSourceRequest request) 
{ 
    var orders = _orderservice.GetAll(); 

    var vm = 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(vm.ToDataSourceResult(request)); 
} 
関連する問題