2

基本上我有一个 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)”方法,并且此方法无法转换为存储表达式。

4

2 回答 2

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但是如果返回大量数据,上述解决方案可能会导致一些问题。

于 2012-08-30T06:59:09.213 回答
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

于 2012-08-30T12:15:13.510 回答