QueryExtender Linq Orderby с использованием TimeSpan.Parse
В основном у меня есть элемент управления QueryExtender для ASP.NET, и сначала мне нужно преобразовать значение sql varchar в TimeSpan типа CSharp, а затем применить к нему условие 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 ответа
Не зная всего о форме вашего 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
Это потому TimeSpan.Parse
недоступен в хранилище, ваш запрос переводится в SQL, если вы используете SQLServer, и это хранилище не имеет TimeSpan.Parse
Один из подходов будет преобразовать его в список, а затем запросить снова.
e.Query = (from p in e.Query.Cast<accounts>()
select p).ToList().OrderBy(p=> TimeSpan.Parse(p.TimeTo));
Но приведенное выше решение может вызвать некоторые проблемы, если ToList
возвращает огромный набор данных.