J'ai une table de produits
. Je souhaite obtenir une colonne spécifique (uniquement les colonnes de nom et de prix) de cette table, mais j'obtiens une erreur. Que fais-je mal?
Pour résumer, je veux écrire
public List<products> GetNameAndPrice() { using (EtradeContext context = new EtradeContext()) { var result = (from x in context.prdcts where x.name == "emre" select new products { name = x.name, price=x.price }).ToList(); return result; } }
mais dans mon code basé sur Entity Framework.
public class products { public int ID { get; set; } public string name { get; set; } public decimal price { get; set; } public int stock { get; set; } } public class EtradeContext:DbContext { public DbSet<products> prdcts { get; set; } }
3 Réponses :
Vous ne pouvez pas projeter le résultat sur la même entité. Ce que vous pouvez faire, c'est utiliser un type anonyme, quelque chose comme un DTO , ViewModel ou quelque chose du genre. Mais utiliser la même classe dans le select que vous avez dans votre DBSet produira votre erreur:
var result = (from x in context.prdcts where x.name == "emre" select new ProductDTO { name = x.name, price = x.price }).ToList();
Utilisez ce code:
public class ProductDTO { public string Name { get; set; } public string Price{ get; set; } } public List<ProductDTO> GetNameAndPrice() { using (EtradeContext db= new EtradeContext()) { return (from p in db.prdcts where p.name == "emre" select new ProductDTO { Name = p.name,Price = p.price }).ToList(); } }
Vous pouvez également essayer cette méthode.
Il est clair et optimisé.
using (EtradeContext context = new EtradeContext()) { var result = context.prdcts .Where(x => x.name == "emre") .Select(s => new { name = s.name , price = s.price }).ToList(); return result; }
L'erreur est due au fait que vous avez essayé de projeter le résultat de votre requête sur la même entité que celle que vous avez définie comme Dbset pour Dbcontext signifie que vous ne pouvez pas utiliser l'entité pour projeter le résultat de la requête que vous avez utilisé pour DbSet
Vous avez donc besoin d'un modèle de vue pour collecter le résultat de la requête. donc créer un modèle de vue signifie une nouvelle classe avec le nom et projeter votre résultat dans nouveau comme
productsViewModel
et copier toutes les propriétés deproduits
vers un nouveau, puis changer le type de retour de méthode en Listsélectionnez de nouveaux produitsViewModel {}
Copie possible de L'entité ne peut pas être construite dans un Requête LINQ to Entities
Merci @ er-sho. C'est du travail :)
@EnginOzsozgun, heureux d'entendre et de souhaiter la bienvenue :)