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;
}
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.
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:
Customer
comme je l'ai spécifié ci-dessus, ou:List<ShrunkenCustomer>
(en supposant que ShunkenCustomer
est le nom que vous choisissez pour votre nouvelle classe.)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
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.
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
});
}
}