基本上我有一个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)'方法,并且此方法无法转换为商店表达式。
答案 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