3

モデル:

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>();

クエリ

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)

ReadDateで注文すると、動作します。しかし、他のフィールドで注文しようとすると、エラーが発生します:At least one object must implement IComparable

なぜこのエラーが発生するのですか?そして、どうすればそれを修正できますか?

4

2 に答える 2

2

任意のタイプのアイテムのリストを並べ替える場合はIComparable、並べ替えアルゴリズムがアイテムを比較できるように、そのタイプを実装する必要があります。T1IQueryable、whcihは実装していませんIComparable。T1、T2、T3の文字列値を作成するつもりだったと思います。その場合は、FirstOrDefault()T1などを作成する各linqステートメントに追加する必要があります。

編集

(コメント後)

私はこれを意味します:

T1 = (from t1 in g
     where t1.Name == "T1"
     select t1.Value.ToString("0,0.000")).FirstOrDefault()

現在T1は文字列であるため、並べ替えに使用できます。

于 2012-11-28T13:24:30.507 に答える
0

あなたが試すことができますThenByDescending

var rows = table
    .OrderByDescending(x => x.ReadDate).Skip((pageIndex) * pageSize).Take(pageSize)
    .ThenByDescending(x => x.T1).Skip((pageIndex) * pageSize).Take(pageSize);

更新: 1 つのフィールドで並べ替える場合は、リフレクション (少し遅い) を使用できます。

var tableInfo = table.GetType().GetProperty("T1"); 
var sortedRow = table.OrderByDescending(x => tableInfo.GetValue(x, null)).Skip((pageIndex) * pageSize).Take(pageSize); 
于 2012-11-28T13:43:33.313 に答える