web-dev-qa-db-fra.com

Impossible de convertir implicitement le type '.List <AnonymousType # 1>' en '.List <WebApplication2.Customer>'

Dans le code suivant qui renvoie une liste:

public List<Customer> GeAllCust()
{
    var results = db.Customers
        .Select(x => new { x.CustName, x.CustEmail, x.CustAddress, x.CustContactNo })
        .ToList()
    return results;
}

Je reçois un message d'erreur indiquant que C # ne peut pas convertir la liste:

Erreur: impossible de convertir implicitement le type System.Collections.Generic.List<AnonymousType#1> à System.Collections.Generic.List<WebApplication2.Customer>

Pourquoi donc?

Voici une capture d'écran montrant des informations supplémentaires que Visual Studio fournit dans une info-bulle pour l'erreur:

Est-ce la bonne façon de retourner certaines colonnes au lieu de la table entière ....?

public object GeAllCust()
{
       var results = db.Customers.Select(x => new { x.CustName, x.CustEmail, x.CustAddress, x.CustContactNo }).ToList();
        return results;
}
14
Abdul Khaliq

Lorsque vous regardez le code:

x => new { ... }

Cela crée un nouveau type anonyme . Si vous n'avez pas besoin de retirer uniquement un ensemble particulier de colonnes, vous pouvez simplement effectuer les opérations suivantes:

return db.Customers.ToList();

Cela suppose que Customers est un IEnumerable<Customer>, qui devrait correspondre à ce que vous essayez de retourner.

Modifier

Vous avez noté que vous ne souhaitez renvoyer qu'un certain sous-ensemble de colonnes. Si vous souhaitez obtenir une aide du compilateur lors du codage, vous devez créer une classe personnalisée pour contenir les valeurs:

public class CustomerMinInfo
{
    public string Name { get; set; }
    public string Email { get; set; }
    public string Address { get; set; }
    public int? ContactNumber { get; set; }
}

Modifiez ensuite votre fonction comme suit:

public List<CustomerMinInfo> GetAllCust()
{
    var results = db.Customers.Select(x => new CustomerMinInfo()
    {
        Name = x.CustName,
        Email = x.Email,
        Address = x.Address,
        ContactNumber = x.CustContactNo
    })
    .ToList();

    return results;
}

Cela fonctionnera, cependant , vous perdrez toute relation avec le contexte de la base de données. Cela signifie que si vous mettez à jour les valeurs renvoyées, il ne les restituera pas dans la base de données.

De plus, pour répéter mon commentaire, renvoyer plus de colonnes (à l'exception des tableaux d'octets) ne signifie pas nécessairement un temps d'exécution plus long. Renvoyer un grand nombre de lignes signifie plus de temps d'exécution. Votre fonction renvoie tous les clients de la base de données, qui lorsque votre système se développera, commencera à bloquer votre programme, même avec la quantité réduite de colonnes.

20
gunr2171

Vous sélectionnez un type anonyme, qui n'est pas un Customer.

Si vous voulez faire (en quelque sorte) cela, vous pouvez l'écrire comme ceci:

return db.Customers.Select(x => new Customer { Name = x.CustName, Email = x.CustEmail, Address = x.CustAddress, ContactNo = x.ContactNo }).ToList();

Cela suppose que les propriétés de votre objet Customer sont ce que je les appelais.

** EDIT ** Par votre commentaire,

Si vous souhaitez renvoyer un sous-ensemble de la table, vous pouvez effectuer l'une des deux opérations suivantes:

  1. Renvoyez la forme traduite de Customer comme je l'ai spécifié ci-dessus, ou:
  2. Créez une nouvelle classe pour votre couche métier qui ne contient que ces quatre champs et modifiez votre méthode pour renvoyer un List<ShrunkenCustomer> (en supposant que ShunkenCustomer est le nom que vous choisissez pour votre nouvelle classe.)
6
Mark Avenius

GetAllCust() est censé renvoyer une liste de Customer, Select Nouveau créera une liste de types anonymes, vous devez renvoyer une liste de clients à partir de votre requête. essayer:

var results = db.Customers.Select( new Customer{CustName = x.CustName}).ToList(); //include other fields
4
robasta

Je suppose que Customer est une classe que vous avez définie vous-même? Ma suggestion serait de faire quelque chose comme ceci:

var results = db.Customers.Select(x => new Customer(x.Custname, x.CustEmail, x.CustAddress, x.CustContactNo)).ToList();

La raison en est que vous essayez de renvoyer une liste de Customer mais le résultat de votre lien est une classe anonyme contenant ces quatre valeurs. Cela nécessiterait bien sûr que vous ayez un constructeur qui prenne ces quatre valeurs.

1
kumaheiyama

Fondamentalement, tout ce que vous avez dans le type var, bouclez-le et stockez-le dans la liste <> objet, puis bouclez et atteignez votre cible. List obj = new List ();

        var orderlist = (from a in db.Order_Master
                         join b in db.UserAccounts on a.User_Id equals b.Id into abc
                         from b in abc.DefaultIfEmpty()
                         select new
                         {
                             Order_Id = a.Order_Id,
                             User_Name = b.FirstName,
                             Order_Date = a.Order_Date,
                             Tot_Qty = a.Tot_Qty,
                             Tot_Price = a.Tot_Price,     
                             Order_Status = a.Order_Status,
                             Payment_Mode = a.Payment_Mode,
                             Address_Id = a.Address_Id 

                         });


        List<MasterOrder> ob = new List<MasterOrder>();

        foreach (var item in orderlist)
        {

            MasterOrder clr = new MasterOrder();
            clr.Order_Id = item.Order_Id;
            clr.User_Name = item.User_Name;
            clr.Order_Date = item.Order_Date;
            clr.Tot_Qty = item.Tot_Qty;
            clr.Tot_Price = item.Tot_Price;
            clr.Order_Status = item.Order_Status;       
            clr.Payment_Mode = item.Payment_Mode;
            clr.Address_Id = item.Address_Id;              
            ob.Add(clr);


        }



        using(ecom_storeEntities en=new ecom_storeEntities())
        {
            var Masterlist = en.Order_Master.OrderByDescending(a => a.Order_Id).ToList();


            foreach (var i in ob)
            {
                var Child = en.Order_Child.Where(a => a.Order_Id==i.Order_Id).ToList();
                obj.Add(new OrderMasterChild 
                {
                    Master = i,
                    Childs = Child
                });
            }        


        }
0
saktiprasad swain