Laden...

MVC und LINQ Problem (IEnumerable)

Erstellt von Sonnenenergie vor 12 Jahren Letzter Beitrag vor 12 Jahren 4.951 Views
S
Sonnenenergie Themenstarter:in
4 Beiträge seit 2012
vor 12 Jahren
MVC und LINQ Problem (IEnumerable)

Hallo,

ich versuche gerade eine LINQ-Abfrage an eine View weiterzugeben.
Hier der Code:
Controller:

 public ViewResult Overview(int id)
        {
                     IEnumerable<string> model = (from pd in db.PPDs
                         join ds in db.Datasets on pd.id_ppd equals ds.fi_ppd
                         join field in db.Fields on ds.id_dataset equals field.fi_dataset
                         join fieldname in db.FieldNames on field.fi_name equals fieldname.id_name
                         join category in db.Categories on fieldname.fi_category equals category.id_category
                         select new { fieldname, ds, category });

            return View(model);
	}

View:

 @model IEnumerable<Productdatabase.Models.Category>
@foreach (var item in Model)
{
  @item.str_name 
  
}

Ich erhalte folgende Fehlermeldung:
Der Typ "System.Linq.IQueryable<AnonymousType#1>" kann nicht implizit in "System.Collections.Generic.IEnumerable<string>" konvertiert werden. Es ist bereits eine explizite Konvertierung vorhanden. (Möglicherweise fehlt eine Umwandlung.

Kann mir jemand helfen 🙁

2.891 Beiträge seit 2004
vor 12 Jahren

Du hast als Rückgabe keine Elemente vom Typ Productdatabase.Models.Category, sondern - wie die Fehlermeldung schon sagt - einen anonymen Typen.

Also entweder musst du im Controller deine Query so anpassen, dass Elemente vom Typ "Category" zurückgegeben werden, oder du musst im View mit dynamic arbeiten, damit du auf anonyme Typen zugreifen kannst.

M
402 Beiträge seit 2005
vor 12 Jahren

Hi...

Die Fehlermeldung hat nicht direkt was mit dem View zu tun.

Du erwartest ein IEnumerable<string> und gibst aber new { fieldname, ds, category }, also einen anonymen Typen zurück. Und dieser kann (wie in der Fehlermeldung angegeben) nicht zu string konvertiert werden.

Also musst du entweder das "IEnumerable<string>" ersetzen oder "new { fieldname, ds, category }". Und der View ist natürlich auch eventuell anzupassen...

lg

16.806 Beiträge seit 2008
vor 12 Jahren

.... oder "new { fieldname, ds, category }". .... Man kann keine anonymen Typen aus einer Methode weitergeben.
Man sollte immer Hilfsklassen, zB ViewModels an eine View senden.

2.891 Beiträge seit 2004
vor 12 Jahren

Man kann keine anonymen Typen aus einer Methode weitergeben.

Den Satz kann man aber arg falsch verstehen. Natürlich kann man anonyme Typen aus Methoden zurückgeben. Und man kann später auch damit arbeiten - z.B. mittels Metadaten (etwa beim DataBinding). Oder auch mittels dynamic-Schlüsselwort.

16.806 Beiträge seit 2008
vor 12 Jahren

Okay, ist vielleicht unglücklich formuliert aber ich hoffe der Sinn kam an 😉

S
Sonnenenergie Themenstarter:in
4 Beiträge seit 2012
vor 12 Jahren

Besten Dank für die Antworten.
Leider habe ich es noch nicht hinbekommen.
Hier meine Versuche:

           int row = (from pd in db.PPDs
                       join ds in db.Datasets on pd.id_ppd equals ds.fi_ppd
                       where ds.fi_ppd == id
                       select ds.id_dataset).Min();

            var model = db.Categories.Include(n => n.FieldNames);
            var model = db.Categories.Include(n => n.FieldNames).Where(f => 1.)f.Fields.fi_dataset == row);

            // ---------------------------

            var viewmodel = new DatasetFieldModel
            {
                CategoryItems = db.Categories.ToList(),
                DatasetItems = db.Datasets.ToList(),
                FieldItems = db.Fields.ToList(),
                FieldNameItems = db.FieldNames.ToList()
            };

            // ---------------------------
            
            var model = (from pd in db.PPDs
                         join ds in db.Datasets on pd.id_ppd equals ds.fi_ppd
                         join field in db.Fields on ds.id_dataset equals field.fi_dataset
                         join fieldname in db.FieldNames on field.fi_name equals fieldname.id_name
                         join category in db.Categories on fieldname.fi_category equals category.id_category
                         select new { fieldname, ds, category });

            return View(model.ToList());

1.) schlägt fehl, weil fi_dataset nicht bekannt ist
2.) schlägt fehl, weil das Dataviewmodel nicht zum meiner DB passt
3.) wurde abgeraten

Welche Möglichkeiten gibt es noch?
Da muss es doch was einfaches wie ViewBag oder ähnliches geben.

16.806 Beiträge seit 2008
vor 12 Jahren

Nicht optimal die Art und Weise wie Du das lösen willst, aber folgendes sollte funktionieren (Code nicht überprüft).

public class MyViewEntryClass
{
	public MyType FieldName {get;set;}
	public MyType DS {get;set;}
	public MyType Category {get;set;}

}

IEnumerable<MyViewEntryClass> viewEntries = (from pd in db.PPDs
                          join ds in db.Datasets on pd.id_ppd equals ds.fi_ppd
                          join field in db.Fields on ds.id_dataset equals field.fi_dataset
                          join fieldname in db.FieldNames on field.fi_name equals fieldname.id_name
                          join category in db.Categories on fieldname.fi_category equals category.id_category
                          select new MyViewEntryClass { FieldName = fieldname, DS= ds, Category = category });
 
            return View(viewEntries.ToList());
S
Sonnenenergie Themenstarter:in
4 Beiträge seit 2012
vor 12 Jahren

Besten Dank, so funktionierts.