Announcement

Collapse
No announcement yet.

LINQ-Statement dynamisch zusammenstellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • LINQ-Statement dynamisch zusammenstellen

    Hallo Forum,

    ich habe als Beispiel folgendes Linq-Statement:

    Code:
    var query = from myFields in TBL_MyTabel
    select myFields;
    So bekomme ich alle Felder der TBL_MyTabel Tabelle zurück. Ist möchte aber, abhängig von der Benutzerauswahl, nur bestimmte Felder der Tabelle dynamisch in einer schleife selectieren. Die Aswahl der Benutzer wird als Array übergeben, wie z.B.

    var auswahl = new Array['Id', 'Name', 'PLZ', 'Datum']

    Code:
    var query = from myFields in TBL_MyTabel
    select myFields;
    
    foreach(var inhalt in auswahl ) {
       query = query.Select( x => new { x.inhalt } );
    }
    Linq meckert sich aber an dieser Stelle:

    Code:
    Der Typ 'System.Linq.IQueryable<AnonymousType#1>' kann nicht implizit in 'System.Linq.IQueryable<TestProjekt.Models.TBL_MyTabel>' konvertiert werden.
    Das Ganze funktioniert aber so:

    Code:
    var query = from myFields in TBL_MyTabel
    select new {
         myFields.Id,
         myFields.Name,
         myFields.PLZ,
         myFields.Datum
    };
    Ist mein Vorhaben in der Form machbar?

    Gruß

  • #2
    Also dynamisch zur Laufzeit da einen anderen Typ draus zu machen ist sinnfrei. Wenn die Daten schon da sind warum nicht das ganze Objekt verwenden?

    Wenn du dem User eine Auswahl von Spalten bietest dann ist an der Stelle wo du die Daten dem User präsentierst die Möglichkeit nur die anzuzeigen die der User sehen will. Es ist egal ob das benutzte Object noch andere Properties enthält.
    Oder ist die Tabelle so breit das es aus Gründen der Performance Sinn macht nur bestimmte Spalten aus der Datenbank zu holen? Wenn bei deiner Anwendung solche Performancedinge wichtig sind dann kann man sich aber fragen ob EntityFramework oder Linq2Sql die richtige Wahl sind. Die sind für auf einfache Benutzung und nicht auf das letzte Quentchen Performance getrimmt.

    Comment


    • #3
      Hallo Ralf,

      danke für deine Antwort.
      Ja, das ist richtig. Die Tabelle hat über 30 Felder und mehrere Millionen Datensätze. Da spielt die Performance tatsächlich eine sehr große Rolle. Ich benutze das EntityFramework. Was könnte ich da sonst einsetzen? Ich verstehe aber nicht ganz, warum man die Felder nicht so einfach dynamisch zusammensetzen kann.

      Gruß

      Comment


      • #4
        Was könnte ich da sonst einsetzen? Ich verstehe aber nicht ganz, warum man die Felder nicht so einfach dynamisch zusammensetzen kann.
        Weil du das mit Sprachfeatures machst. Und da C# nunmal eine starktypisierte Sprache ist und damit Typen zur Compilezeit feststehen sollten und nicht erst irgendwann zur Laufzeit. Du kannst ja dann auch gar nicht gegen die Oberfläche dieses Typen programmieren weil du zur Programmierzeit, also vor dem Compilieren, nicht weist wie die zur Laufzeit aussehen wird. Aka macht es meiner Meinung dann gar keinen Sinn daraus einen Typen zu machen wenn man denn nicht benutzen kann (beim Programmieren). Die Kaspelung als Typ ist dann nur sinnfreier Overhead. Ich würde dann ganz einfach klassisch die Daten abrufen wenn ich Dinge die mir ein OR Mapper liefert (eben Objekte) nicht wirklich nutze.

        Aber mal davon abgesehen es gibt natürlich dynamisches Linq, schön gekapselt z.B. hier (bekommt man auch per Nuget), das ist sinnvoll um dynamisch Filterbedingungen (z.B. die Where Klausel) zusammenzusetzen. Um dynamisch Typen zu erzeugen sehe ich das eher problematisch weiß auch gar nicht ob das damit möglich ist.

        Comment


        • #5
          Hi,

          mir ist das bewusst. Aber solange ich noch bei der Zusammensetzung der Select-Anweisung bin sollte da eigentlich nichts passieren. Ich muss nur den Typ anpassen können, was mir nicht ganz klar ist, wie. LINQ-Statements können ja unterschiedlich zusammengesetzt werden.

          Gruß

          Comment


          • #6
            ich würd mir das gerne ansehen, komm aber mit deinem Code nicht sehr weit

            nehm ich diesen(natürlich angepasst), dann gibt es 'inhalt' nicht

            Code:
            var query = from myFields in TBL_MyTabel
            select myFields;
            
            foreach(var inhalt in auswahl ) {
               query = query.Select( x => new { x.inhalt } );
            }
            Aber, davon unabhängig das array ist vom typ string
            var auswahl = new Array['Id', 'Name', 'PLZ', 'Datum']

            damit kann die query.select methode nichts anfangen.
            Für mich ist das Entity Model Neuland, ich kenn zu wenig der Objecte. ABer, von welchem Typ ist denn der "select new { myFields.CustomerID....} string?;
            Wenn sich das so aufbauen liesse, sagen wir, dieser Teil steckt in in einer Variablen: " var query = from myFields in TBL_MyTabel"
            Dann ein switch um zunächst die Anzahl der fields zu bestimmen, die vom User genannt wurden.
            In den switch abschnitten musste dann der select new teil ausgewählt werden, evntl so:

            zunächst ein query das alle fileds hat
            var query = from myFields in TBL_MyTabel
            select new { myFields.Id, myFields.Name, myFields.PLZ, myFields.Datum};

            switch (Anzahl)
            {
            case "bla":
            foreach (tmpElement in arrAuswahl)
            if arrAuswahl[0] == query.ElementType.FullName // muss hier gleich dazuschreiben, dies bringt nicht den Namen des Filds
            {myVariable = myVariable + query.ElementType.FullName }

            break;
            }


            sodass man am schluss schreiben kann :

            var query2 = from myFields in TBL_MyTabel
            select new { myVariable };
            JonDonym: privacy needs anonymity more than ever

            Comment

            Working...
            X