2012-11-28 68 views
3

型號:至少有一個對象必須實現IComparable?

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

爲什麼我得到這個錯誤?我該如何解決它?

回答

2

如果要對任何類型的項目列表進行排序,則該類型必須實施IComparable,以便排序算法能夠比較項目。 T1IQueryable,它不執行IComparable。我想你打算爲T1,T2和T3創建字符串值。如果是這樣,你應該添加FirstOrDefault()到每個LINQ語句創建T1等

編輯

(您的評論後)

我的意思是這樣的:

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

現在T1是一個字符串,因此,它可以用於排序。

+0

是。您的建議有效。但我完全無法理解。特別是在最後一句話中。非常感謝。 –

0

你可以嘗試ThenByDescending

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

UPDATE: 您可以使用反射(有點慢),如果訂購的一個領域:

var tableInfo = table.GetType().GetProperty("T1"); 
var sortedRow = table.OrderByDescending(x => tableInfo.GetValue(x, null)).Skip((pageIndex) * pageSize).Take(pageSize); 
+0

我想只訂購一個字段。還有動態LINQ表達式。 –

+0

對不起,但我想試試動態查詢。感謝您的回覆。 –

相關問題