Announcement

Collapse
No announcement yet.

Anonyme Objekte sortieren

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

  • Anonyme Objekte sortieren

    Hallo,

    ich habe eine Liste von anonymen Objekten wie folgt:

    Code:
     List-----> new { id = 1, datum = 2015.01.01 00:00:00, value = 123 }
                   new { id = 1, datum = 2015.01.03 00:00:00, value = 123 }
                   new { id = 1, datum = 2015.01.06 00:00:00, value = 123 }
                   new { id = 1, datum = 2015.01.05 00:00:00, value = 123 }
                   new { id = 1, datum = 2015.01.02 00:00:00, value = 123 }
    Ich muss nun diese Liste nach datum sortieren. Weiß jemand, wie und ob das gehet?
    Ich habe versucht dies via Reflection zu erledigen, leider kein erfolg:

    Code:
    MyList.OrderBy(x => x.GetType().GetProperty("TimeStamp").GetValue(tempQuery, null)
    Gruß

  • #2
    Hättest du nicht gleich dort wo du die Liste erzeugst auch sortieren können? Wenn du diese Liste in mehreren Contexten unterschiedlich sortiert brauchst solltest du überlegen eine konkrete Klasse zu nehmen und nichts anonymes. Damit dein Code funktioniert mußt du eh zur Compilezeit wissen wie die Property heißt. Es hilft also nicht die Bohne das die Klasse anonym und nicht konkret ist. Mal davon abgesehen das du wohl eher datum meintest anstatt TimeStamp.

    Comment


    • #3
      Hallo,

      dnake. Das ist richtig. Die Liste wird in verschiedenen Instanzen gefüllt. Ich muss am Ende die Liste sortieren. Eine konkrete Klasse zu nehmen, wäre auch nicht so einfach, weil ich momentan mit Dynamic Linq arbeite und die Handhabung ist an dieser Stelle nicht so einfach. Vor allem, weil ich nicht weiß, wie ich diese bei "new" zusammenbauen muss.

      Die Klasse/Model hat hier vier Properties:

      Code:
       
              public int Id { get; set; }
              public DateTime Datum { get; set; }
              public float Value1{ get; set; }
              public float Value2{ get; set; }
      und meine bisherige Query:

      Code:
       
      var query = (_db.MyTabel.Where("Id == @0 And Datum >= @1 And Datum < @2",
                        devId, Datum1, Datum2).Select("new (DeviceId, TimeStamp, Value1, Value2)").ToList<object>();
      Wie soll nun die Query mit einer konkrten Klasse ausehen? Ist es so korrekt?

      Code:
       
      var query = (_db.MyTabel.Where("Id == @0 And Datum >= @1 And Datum < @2",
                        devId, Datum1, Datum2).Select("new MyModel (DeviceId = DeviceId, TimeStamp = TimeStamp, Value1 = Value1, Value2 = Value2")).ToList<object>();

      Gruß

      Comment


      • #4
        In deiner Query sehe ich gerade nicht die Notwendigkeit für dynamic Linq.

        [HIGHLIGHT=C#]var query = _db.MyTabel.Where("DeinLieberFilterAusdruck").Sele ct(x=> new DeineLiebeModelKlasse() { DeviceId = DeviceId, TimeStamp = TimeStamp, Value1 = Value1, Value2 = Value2}).ToList();[/HIGHLIGHT]

        Comment


        • #5
          Hallo Ralf,

          eigentlich werden die zwei Values (Tabellen-Felder) als Parameter übergeben, die unterschiedich sein können:

          Code:
           
          var query = (_db.MyTabel.Where("Id == @0 And Datum >= @1 And Datum < @2",
                            devId, Datum1, Datum2).Select("new (DeviceId, TimeStamp," + Value1 + "," Value2 + ")").ToList<object>();
          Daher muss ich leider an dieser Stelle Dynamic Linq einsetzen.

          Gruß

          Comment


          • #6
            Dann häng an deinen Selectaufruf mit dynamischen Linq und anonymer Klasse einen weiteren Select der die Daten aus der anonymen Klasse in eine konkrete Klasse umfüllt.
            Dann mußt du nicht den bisherigen Linq Abfrage Code prinzipiell irgendwie ändern. Im dynamischen Select sollte dann aber value1 und value2 konkrete Namen bekommen, egal aus welcher Spalte die stammen. So wie jetzt heißen die später ja auch im Code irgendwie. ISt dann schlecht mit zu arbeiten.

            Comment


            • #7
              Hallo Ralf,

              danke. Irgendiwe will das nicht klappen. Der zweite Select lässt leider so etwas nicht zu:

              Code:
               
              var query = (_db.MyTabel.Where("Id == @0 And Datum >= @1 And Datum < @2",
                                devId, Datum1, Datum2).Select("new (DeviceId, TimeStamp," + Value1 + "," Value2 + ")").Select(x => ...)).ToList<object>();
              Das habe ich an unterschiedlichen Stellen ausprobiert.

              Gruß

              Comment


              • #8
                Irgendiwe will das nicht klappen.
                Irgendwie zu dünn um da zu helfen.
                Ohne den dynamic Linq Syntax genau zu kennen hätte ich gedacht es müsste so oder ähnlich aussehen.
                Möglicherweise mußt du zwischen den beiden Selects noch ein ToList() einfügen. Wenn dem so wäre fänd ich das allerdings merkwürdig.

                [HIGHLIGHT=C#]
                var query = _db.MyTabel.Where("Id == @0 And Datum >= @1 And Datum < @2", devId, Datum1, Datum2)
                .Select("new (DeviceId, TimeStamp," + Value1 + " as Value1," Value2 + " as Value2)")
                .Select(x => new MeinLiebeModelKlasse() { DeviceId = x.DeviceId, TimeStamp = x.TimeStamp, Value1 = x.Value1, Value2 = x.Value2 })
                .ToList();[/HIGHLIGHT]

                Comment


                • #9
                  Hallo Ralf,

                  vielen Dank für deine Bemühung.
                  Wie schon oben erwähnt, nach dem ersten Select wird keine Methode oder Aggregate mehr einsetzbar und wird es mit einer Fehlermeldung (kann nicht aufgelöst werden) quittiert.

                  Code:
                   
                  var query = _db.MyTabel.Where("Id == @0 And Datum >= @1 And Datum < @2", devId, Datum1, Datum2)
                                         .Select("new (DeviceId, TimeStamp," + Value1 + " as Value1," Value2 + " as Value2)")
                  
                                         [.Select(x => new MeinLiebeModelKlasse() { DeviceId = x.DeviceId, TimeStamp = x.TimeStamp, Value1 = x.Value1, Value2 = x.Value2 })
                                         .ToList();] --> Leider ghet nicht
                  Gruß

                  Comment


                  • #10
                    Also ich kenne mich mit LINQToSQL nicht wirklich gut aus, aber koenntest Du nicht wie im ersten Beispiel einfach sowas machen:

                    [highlight=c#]
                    (new [] {
                    new { test = 3 },
                    new { test = 2 },
                    new { test = 1 }
                    }).OrderBy(x => ((dynamic)x).test)
                    [/highlight]

                    Das funktioniert bei mir in LinqPad. Ich habe mich auf das Anfangsbeispiel bezogen. Es muessen natuerlich alle Objekte ein Property mit diesem Namen haben

                    Comment


                    • #11
                      Hi,

                      danke für deine Hilfe,
                      Ohne Dynamic Linq wäre vieles einfacher. Leider das kann sonicht ganz funktionieren. Ich habe mittlerweile enen anderen Weg via Reflection gefunden, der mein Problem löst und auch sehr schnell ist.

                      Gruß

                      Comment

                      Working...
                      X