2
votes

Comment obtenir une colonne spécifique dans Entity Framework

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


5 commentaires

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 productsViewModel et copier toutes les propriétés de produits vers un nouveau, puis changer le type de retour de méthode en List et projeter votre résultat dans nouveau comme sé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 :)


3 Réponses :


3
votes

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


0 commentaires

0
votes

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


0 commentaires

0
votes

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


0 commentaires