Modell:
return (from m in meterReadings
group m by new { date = m.ReadDate } into g
select new
{
ReadDate = g.Key.date.ToString("dd.MM.yyyy - HH:mm:ss"),
T1 = from t1 in g
where t1.Name == "T1"
select t1.Value.ToString("0,0.000"),
T2 = from t2 in g
where t2.Name == "T2"
select t2.Value.ToString("0,0.000"),
T3 = from t3 in g
where t3.Name == "T3"
select t3.Value.ToString("0,0.000"),
Total = from total in g
where total.Name == "Toplam"
select total.Value.ToString("0,0.000")
}).AsQueryable<object>();
Abfrage
var table = MeterReadingManager.GetMeterReadingsPivot(meterReadings, 1);
//No Error (in title)
rows = table.OrderBy("ReadDate","desc").Skip((pageIndex) * pageSize).Take(pageSize)
//Error (in title)
rows = table.OrderBy("T1","desc").Skip((pageIndex) * pageSize).Take(pageSize)
Wenn ich per ReadDate bestelle, funktioniert es. Wenn ich jedoch versuche, nach anderen Feldern zu ordnen, wird der Fehler At least one object must implement IComparable
: At least one object must implement IComparable
Warum bekomme ich diesen Fehler? Und wie kann ich das beheben?
Wenn Sie eine Liste von Elementen eines beliebigen Typs sortieren möchten, muss der Typ IComparable
implementieren, IComparable
der Sortieralgorithmus Elemente vergleichen kann. T1
ist ein IQueryable
, Whcih nicht implementiert IComparable
. Ich denke, Sie wollten Zeichenfolgenwerte für T1, T2 und T3 erstellen. In diesem FirstOrDefault()
sollten Sie jeder linq-Anweisung, die T1 usw. erstellt, FirstOrDefault()
hinzufügen.
Bearbeiten
(Nach deinem Kommentar)
Ich meine das:
T1 = (from t1 in g
where t1.Name == "T1"
select t1.Value.ToString("0,0.000")).FirstOrDefault()
Jetzt ist T1
eine Zeichenfolge und kann daher beim Sortieren verwendet werden.
Sie könnten ThenByDescending
ausprobieren:
var rows = table
.OrderByDescending(x => x.ReadDate).Skip((pageIndex) * pageSize).Take(pageSize)
.ThenByDescending(x => x.T1).Skip((pageIndex) * pageSize).Take(pageSize);
UPDATE : Sie können Reflection (etwas langsamer) verwenden, wenn Sie nach einem Feld bestellen:
var tableInfo = table.GetType().GetProperty("T1");
var sortedRow = table.OrderByDescending(x => tableInfo.GetValue(x, null)).Skip((pageIndex) * pageSize).Take(pageSize);