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 возвращает огромный набор данных.

Другие вопросы по тегам