0

J'ai une grille Kendo UI MVC Core Orders avec une colonne MultiSelectFor qui peut avoir plusieurs clients. Tout fonctionne bien, mais j'ai plus de 2000 enregistrements, donc cela prend vraiment trop de temps pour afficher ma liste en raison des données qui doivent être extraites de la table many-to-many. J'utilise d'abord la base de données avec EF pour échafauder le modèle db.Optimisation des requêtes de données associées avec un modèle de vue

Voici le modèle de la table des commandes générées par EF (j'ai supprimé le code inutile):

public partial class Orders 
{ 
    public Orders() 
    { 
     OrdersCustomers = new HashSet<OrdersCustomers>(); 
    } 
    public int JobNo { get; set; } 
    public ICollection<OrdersCustomers> OrdersCustomers { get; set; } 
} 

Mon point de vue modèle OrdersVM (voir le modèle):

public class OrdersVM 
{ 
    public int JobNo { get; set; } 

    [UIHint("OrdersCustomersET")] 
    [Required(ErrorMessage = "A Customer is required")] 
    public IEnumerable<OrdersCustomersVM> OrdersCustomers { get; set; } 
} 

EF généré code 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; } 
} 

Mon OrdersCustomers Voir Modèle:

public class OrdersCustomersVM 
{ 

    public int JobNo { get; set; } 
    public string ClientName { get; set; } 
    public string ClientId { get; set; } 
} 

Mon contrôleur:

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)); 
    } 

Je voudrais optimiser mon code soit avec cache, etc., car il n'a pas de sens d'avoir autant de requêtes SQL (je peux voir que dans profileur SQL Server) .

Ma grille de Kendo est un type de grille Ajell (vrai) incell.

Répondre

0

En créant une interface, la requête est optimisée automatiquement il semble. N'étant pas un expert dans Asp.net Core/EF Core, peut-être que quelqu'un peut expliquer pourquoi il le fait.

Si la requête se trouve dans le contrôleur, la page prend 32 secondes pour renvoyer des données, car elle crée une requête distincte pour chaque ligne.

Si la requête passe par une interface, cela prend 947 ms.

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

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

    } 

Ensuite, dans le contrôleur:

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)); 
}