使用TimeSpan.Parse的QueryExtender Linq Orderby

时间:2012-08-30 06:49:19

标签: c# asp.net linq query-extender

基本上我有一个ASP.NET和的QueryExtender控件 首先,我需要将sql varchar值转换为CSharp类型的TimeSpan,然后对其应用Linq OrderBy子句,但在执行时会出错。

这是我的代码:

  protected void FilterProducts(object sender, CustomExpressionEventArgs e)
    {
      e.Query = (from p in e.Query.Cast<accounts>()
                  select p).OrderBy(p=> TimeSpan.Parse(p.TimeTo));
    }

错误: LINQ to Entities无法识别方法'System.TimeSpan Parse(System.String)'方法,并且此方法无法转换为商店表达式。

2 个答案:

答案 0 :(得分:1)

这是因为TimeSpan.Parse在商店中不可用,如果您使用SQLServer,您的查询将被转换为SQL,并且该商店没有TimeSpan.Parse,一种方法是将其转换为列表然后再次查询。

e.Query = (from p in e.Query.Cast<accounts>()
           select p).ToList().OrderBy(p=> TimeSpan.Parse(p.TimeTo));

但是如果ToList返回大量数据,上述解决方案可能会导致一些问题。

答案 1 :(得分:1)

在不了解p.TimeTo数据形状的情况下,我认为您可以使用字符串值排序,这样:

from p in e.Query.Cast<accounts>()
select p).OrderBy(p => p.TimeTo.Length).ThenBy(p => p.TimeTo)

这样,值1:00将在11:00之前排序。

修改

采取:

var s = new[] { "12:10", "8:00", "8:20",  "1:00", "1:02", "10:00", "11:10" };

看看

之间的区别
s.OrderBy (x => x);

s.OrderBy (x => x.Length).ThenBy (x => x);

这是:

  

1:00
  1:02
  10:00
  11:10
  12:10
  8:00
  8:20

  

1:00
  1:02
  8:00
  8:20
  10:00
  11:10
  12:10