2012-11-28 69 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

对不起,但我想试试动态查询。感谢您的回复。 –

相关问题