Entité Core Framework: Limitations de projection dans LINQ aux requêtes entités
Lors de l'utilisation du noyau du framework d'entité, la construction directe d'objets d'entité dans la projection d'une requête LINQ à entités conduit souvent à l'erreur: "L'entité ou le type complexe ne peut pas être construit dans une requête LINQ à des entités."
Le problème:
Considérez cet exemple:
<code class="language-csharp">public IQueryable<Product> GetProducts(int categoryID) { return from p in db.Products where p.CategoryID == categoryID select new Product { Name = p.Name }; }</code>
exécuter cela avec productRepository.GetProducts(1).ToList();
échouera.
pourquoi il échoue:
Le problème découle du fait que l'entité Core Framework traduit les requêtes LINQ en commandes de base de données. Le serveur de base de données n'a pas la connaissance de la classe Product
de votre application et de son constructeur. Par conséquent, il ne peut pas créer des instances de cette classe.
La solution: Projeter vers des types anonymes ou DTOS
La solution consiste à projeter vos résultats de requête dans des types anonymes ou des objets de transfert de données dédiés (DTO).
Méthode 1: Utilisation de types anonymes
Il s'agit d'une solution rapide et simple pour les requêtes plus petites:
<code class="language-csharp">var products = (from p in db.Products where p.CategoryID == categoryID select new { Name = p.Name }).ToList();</code>
Méthode 2: Utilisation d'objets de transfert de données (DTOS)
Pour des scénarios plus complexes ou lorsque vous avez besoin d'objets fortement typés, créez un DTO:
<code class="language-csharp">public class ProductDTO { public string Name { get; set; } // Add other properties as needed } public List<ProductDTO> GetProducts(int categoryID) { return (from p in db.Products where p.CategoryID == categoryID select new ProductDTO { Name = p.Name }).ToList(); }</code>
En projetant des types anonymes ou des DTO, vous contournez la nécessité de la base de données pour instancier vos cours d'entités, assurant une exécution réussie de la requête.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!