Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
MVC und LINQ Problem (IEnumerable)
Sonnenenergie
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

MVC und LINQ Problem (IEnumerable)

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 3138

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
[email protected]
myCSharp.de - Member



Dabei seit:
Beiträge: 407

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15967

beantworten | zitieren | melden

Zitat
.... 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 - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
dN!3L
myCSharp.de - Experte

Avatar #avatar-2985.png


Dabei seit:
Beiträge: 3138

beantworten | zitieren | melden

Zitat von Abt
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.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15967

beantworten | zitieren | melden

Okay, ist vielleicht unglücklich formuliert aber ich hoffe der Sinn kam an ;-)
- performance is a feature -

Microsoft MVP - @Website - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Sonnenenergie
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

beantworten | zitieren | melden

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.
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15967

beantworten | zitieren | melden

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 - @blog - @AzureStuttgart - github.com/BenjaminAbt
private Nachricht | Beiträge des Benutzers
Sonnenenergie
myCSharp.de - Member



Dabei seit:
Beiträge: 4

Themenstarter:

beantworten | zitieren | melden

Besten Dank, so funktionierts.
private Nachricht | Beiträge des Benutzers