none
Linq-Abfrage in eine IEnummerable konvertieren RRS feed

  • Frage

  • Hallo an alle,

    ich habe folgendes Problem: Ich arbeite an meiner ersten MVC anwendung und möchte nun die Daten die per Linq to entities abfrage (nur bestimmte Daten abfragen) in einem Grid anzeigen. Nun bekomme ich immer die Fehlermeldung, dass meine View eine generic.IEnumeralbe verlangt ich aber meine Abfrage z.B. in eine List(Of String) wandle! Da in der DB viele unterschiedliche Daten liegen (Integer; String; date usw.) kann ich keine List(Of Integer) oder ähnliches anlegen. Wie kann ich nun das Abfrageergebnis in den richtigen Typ konvertieren?

    Brauche ich hier eine eigene Klasse in der ich das Abfrageergebnis ablegen?

    Bin für jede Hilfe dankbar!

    Markus

    Montag, 9. Juli 2012 05:39

Antworten

  • Hallo Sebastian,

    danke für Deine Hilfe! Über die selbst erstellte Ienummerable Klasse funktioniert dann die Anzeige der gewünschten Daten in meiner View!

    Gruß Markus

    • Als Antwort markiert Markus.G Dienstag, 10. Juli 2012 04:58
    Dienstag, 10. Juli 2012 04:57

Alle Antworten

  • Hallo Markus,

    grundsätzlich musst du gar nicht so viel "konvertieren". List<T> erbt von IEnumerable<T> und kann auch dahingehend verwendet werden. Du musst auch nicht zwangsläufig alle Felder als String zurückgeben. Kannst du noch ein paar Informationen nachreichen? Welche Grid Komponente verwendest du zur Anzeige (evtl. Code Snippet)? Was steht in den ersten 3 Zeilen deiner View? Wie sieht deine Controller Methode aus? Kannst du ein paar Zeilen aus deiner Linq Query posten?

    Gruß Sebastian

    Montag, 9. Juli 2012 10:08
  • Hallo Sebastian,

    danke für Deine Antwort:

    Hier noch weitere Infos:

    Der Controller: (mein letzter Versuch)

    Function Connections() As ActionResult
            Dim p As New nxTestLogDBEntities
            Dim mListe As IEnumerable(Of Object)
            mListe = p.Verbindungen.ToList
            Dim DetailListe = (From a In mListe
                                    Where a.nr = 1
                                 Select a.nr, a.Datum, a.Zeit, a.Anzahl, a.Signal, a.RTC_Syncro, a.ConnectedTime, a.IP_Adresse).ToArray
    
            Dim _Liste As New List(Of String)
            For Each a In DetailListe
                _Liste.Add(a.Stationsnr.ToString + "," + a.Datum.ToString + "," + a.Zeit.ToString + "," + a.Anzahl_DBWerte.ToString)
    
            Next
         
           Return (View(_Liste))
        End Function

    Hier die View: (Ich verwende ein Grid von ComponentOne (ASP.NET Wijmo MVC)

    @ModelType ienumerable (Of Service.Verbindungen)
    
    <p>
        @Html.ActionLink("Create New", "Create")
    </p>
    <table id="listGrid">
    	<thead>
    .
    @For Each item In Model
        Dim currentItem = item
        @<tr>
            <td>
    
    <script type="text/javascript">
    	$(document).ready(function () {
    		$("#listGrid").wijgrid({ allowSorting: true, allowPaging: true, pageSize: 20});
    	});
    </script>

    Also noch zum gesamten: Wenn ich die alle Daten hole p.Verbindungen.tolist, dann läuft die Sache. Nur wenn ich mit Linq die abgefragte Datenmenge reduzieren will bekomme die Fehlermeldung:

    Das Modellelement, das an das Wörterbuch übergeben wurde, besitzt den Typ "System.Collections.Generic.List`1[System.String]". Dieses Wörterbuch erfordert jedoch ein Modellelement vom Typ "System.Collections.Generic.IEnumerable`1

    Ich hoffe Du kannst mir da weiterhelfen, denn im Moment finde ich hier keine Lösung und habe auch im Internet noch nichts nützliches gefunden!

    Vielen Dank

    Markus

    Montag, 9. Juli 2012 10:43
  • Hallo Markus,

    in deinem Controller gibst du eine Liste vom Typ String zurück. In deiner View erwartest du allerdings ein IEnumerable vom Typ "Service.Verbindungen". Ändere doch mal den Eintrag in der ersten Zeile der View (@ModelType) auf IEnumerable(Of String).

    Gruß Sebastian

    Montag, 9. Juli 2012 10:55
  • Hallo Sebastian,

    danke für den Hinweis aber das funktioniert leider nicht, da die View stark typisert erstellt wurde und die Daten dann per Expression aus dem Model Service.Verbindungen ausgelesen werden. Damit die weitere Verarbeitung läuft, muß ich ein Objekt von Service.Verbindungen zurück geben oder eben ein Objekt das dem entspricht, Oder?

    Gruß Markus

    Montag, 9. Juli 2012 12:01
  • Hallo Markus,

    das grundlegende Problem ist, dass "List(Of String)" ungleich "IEnumerable(Of Service.Verbindungen)" ist. Wenn du in der View also zwingend eine Auflistung vom Typ "Service.Verbindungen" brauchst, dann muss diese auch vom Controller zurückgeliefert werden. Würde also heißen du machst aus deinem "Dim _Liste As New List(Of String)" ein "Dim _Liste As New List(Of Service.Verbindungen)".

    Im Controller machst du ja im Augenblick folgendes:

    1. Du erzeugst ein IEnumerable(Of Object) mit der Bez. "mListe"

    2. Du schreibst mit p.Verbindungen.ToList den Inhalt (was auch immer das für Daten zurückliefert) als Liste in das zuvor erzeugte IEnumerable: mListe

    3. Du baust eine Variable DetailListe und hängst per LINQ einen Teil der ursprünglich zurückgelieferten Daten an.

    Nun gehst du her und baust daraus wieder eine Untermenge in Form eines Strings zusammen und hängst diese an eine Liste vom Typ String an.

    Diese lieferst du dann per return an die View.

    Was also letztendlich bei der View ankommt ist eine Liste vom Typ String wohingegen die View aber ein IEnumerable von Typ Service.Verbindungen erwartet.

    Wenn du jetzt z.B. nicht "_Liste" sondern "mListe" zurückschickst, dann wird der Fehler höchstwahrscheinlich verschwunden sein. Nun willst du aber, wenn ich das richtig verstanden habe, nur einen Teil der Daten aus "mListe" zurückgeben. Dafür baust du dir dann eine eigene Klasse mit den entsprechenden Feldern und gibst diese dann als IEnumerable oder List zurück. Es ist nur wichtig, dass der Return Wert der Methode im Controller und der erwartetet ModelType in der View gleich sind.

    Gruß Sebastian

    • Als Antwort vorgeschlagen Sebastian85 Dienstag, 10. Juli 2012 06:17
    Montag, 9. Juli 2012 12:33
  • Hallo Sebastian,

    danke für Deine Hilfe! Über die selbst erstellte Ienummerable Klasse funktioniert dann die Anzeige der gewünschten Daten in meiner View!

    Gruß Markus

    • Als Antwort markiert Markus.G Dienstag, 10. Juli 2012 04:58
    Dienstag, 10. Juli 2012 04:57