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 🙁
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.
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
.... oder "new { fieldname, ds, category }". .... Man kann keine anonymen Typen aus einer Methode weitergeben.
Man sollte immer Hilfsklassen, zB ViewModels an eine View senden.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
Okay, ist vielleicht unglücklich formuliert aber ich hoffe der Sinn kam an 😉
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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.
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());
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code