2009-07-08 13 views
2

Ich verwende ASP.net MVC mit C#. Warum das ist code:Weitergabe anonymer Typen in 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; 
} 

zeigt den folgenden fehler?

Fehler 1 kann nicht implizit Typ System.Linq.IQueryable<AnonymousType#1> zu System.Linq.IQueryable<eim.Models.Product> konvertieren. Eine explizite Konvertierung vorhanden ist (sind Sie ein gegossenes fehlt?)

Antwort

8

Da select new { s.width, s.height, s.number} bedeutet System.Linq.IQueryable<AnonymousType#1> aber Ihre Funktion erwartet IQueryable<Product> zurückzukehren. Ändern Sie Ihren 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; 
} 

AKTUALISIERT:

Oder vielleicht möchten Sie 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; 
} 

Wenn Sie nur 3 Eigenschaften Breite + Höhe + Anzahl neuer Typ erstellen. Zum Beispiel:

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

Die letzte Zeile Ihrer LINQ-Abfrage

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

nur diese drei Felder aus Ihrer Tabelle „db.Stocks“ wählen, und dies erzeugt einen neuen, anonymen Typen, das ist was in "result" gespeichert und zurückgegeben wird.

Was Sie zurückgeben in den "Ergebnisse zurückgeben;" Erklärung daher ist nicht ein IQueryable<Product> - es ist etwas völlig anderes (dass IQueryable eines anonymen Typs).

Wenn Sie Produkte zurückgeben möchten, müssen Sie diesen anonymen Typ in ein "Produkt" umwandeln (oder eine neue Produktklasse aus den ausgewählten Feldern erstellen).

Marc