2009-07-08 11 views
2

J'utilise ASP.net MVC avec C#. Pourquoi cela est le code:Passer des types anonymes dans ASP.NET MVC

public IQueryable<Product> ListProducts(string prodcutType) 
{ 
    var results = from p in db.Products 
     join s in db.Stocks 
     on p.ID equals s.IDProduct 
     where p.ptype == prodcutType 
     select new { s.width, s.height, s.number};     
    return results; 
} 

montrant l'erreur suivante?

Erreur 1 Impossible de convertir implicitement le type System.Linq.IQueryable<AnonymousType#1> à System.Linq.IQueryable<eim.Models.Product>. Il existe une conversion explicite (vous manque un casting?)

Répondre

8

Parce que select new { s.width, s.height, s.number} signifie System.Linq.IQueryable<AnonymousType#1> mais votre fonction prend pour revenir IQueryable<Product>. Changer votre code:

public IQueryable<Product> ListProducts(string prodcutType) 
{ 

    var results = from p in db.Products 
        join s in db.Stocks 
        on p.ID equals s.IDProduct 
        where p.ptype == prodcutType 
        select p; 
    return results; 
} 

MISE À JOUR:

Ou peut-être que vous voulez IQueryable<Stock>:

public IQueryable<Stock> ListProducts(string prodcutType) 
{ 

    var results = from p in db.Products 
        join s in db.Stocks 
        on p.ID equals s.IDProduct 
        where p.ptype == prodcutType 
        select s; 
    return results; 
} 

Si vous voulez seulement 3 propriétés largeur + hauteur + numéro Créer un nouveau type. Par exemple:

public class SomeType { 
    public int Width { get; set; } 
    public int Height { get; set; } 
    public int Number { get; set; } 
} 

public IQueryable<SomeType> ListProducts(string prodcutType) 
{ 

    var results = from p in db.Products 
        join s in db.Stocks 
        on p.ID equals s.IDProduct 
        where p.ptype == prodcutType 
        select new SomeType { 
         Width = s.width, 
         Height = s.height, 
         Number = s.number 
        }; 
    return results; 
} 
1

La dernière ligne de votre requête LINQ

select new { s.width, s.height, s.number};  

sélectionneront ces trois champs de votre table « db.Stocks », et cela crée un nouveau type anonyme, qui est ce qui est stocké dans "résultats" et renvoyé. Ce que vous retournez dans les «résultats de retour»;

déclaration donc n'est pas un IQueryable<Product> - c'est quelque chose de totalement différent (que IQueryable d'un type anonyme).

Si vous souhaitez retourner des produits, vous devez convertir ce type anonyme en "Produit" (ou créer une nouvelle classe de produit à partir des champs sélectionnés).

Marc

Questions connexes