2016-07-18 3 views
0

Мне нужно выбрать записи из таблицы для интервала дат.Entity framework «Выбор даты времени из строки»

Но дата для выбора хранится как NVARCHAR в этой модели

20160511_155015 (yyyymmdd_hhmmss)

Я не могу использовать ToList(), чтобы сделать его как DateTime.ParseExact(entry.StartDate, "yyyyMMdd_HHmmss", CultureInfo.InvariantCulture)

таблица хранит несколько миллионов записей. Так что мне нужно сделать что-то вроде этого:

var preQuery = context.Table 
       .AsNoTracking() 
       .Select(x => new 
      { 
       StartDate = ConvertFrom()), 
       Mode = x.Mode, 
       SessionStart = x.AStart, 
       SessionEnd = x.AEnd, 
       x.SensorNumber 
      }) 
      .Where(x => x.StartDate != null 
        && x.StartDate >= startDate 
        && x.StartDate <= endDate) 
      .ToList(); 

Можно ли преобразовать строковое представление в DATETIME, а затем продолжить ИНЕКЕ?

+0

Почему вы храните их в этом беспорядке вместо 'datetime'? –

+0

Эта архитектура БД унаследована от идиотов! – Roman

+1

@ Roman: это так, возможно, это * схема *, которая должна быть * переработана *? У вас нет необходимости внедрять новый дизайн за один раз. В качестве первого шага вы можете создавать представления (с правильными столбцами и типами), а затем преобразовывать представления в материализованные представления, а не делать своп: превращать материализованные представления в таблицы и прежние таблицы в просто виды; наконец, отбросить таблицы. –

ответ

0

Вы можете попробовать: StartDate.StartsWith ("20160511") или так .. или Convert.ToInt32 (StartDate.Substring (0,8))> 20160511

, кстати, я думаю, вы можете запустить скрипт, до тех пор, как он принимает, и создать новый столбец, который будет генерировать DateTime на основе этой колонки

+0

Я не могу использовать ToList() для использования DateTime.parseExact – Roman

0

Пожалуйста, попробуйте этот DateTime.ParseExact(dateTime ,format,CultureInfo.InvariantCulture);

var preQuery = context.Table.AsNoTracking().Select(x => new 
     { 
      StartDate = ConvertFrom(), 
      Mode = x.Mode, 
      SessionStart = DateTime.ParseExact(x.AStart,"yyyyMMdd_HHmmss", CultureInfo.InvariantCulture), 
      SessionEnd = DateTime.ParseExact(x.AEnd,"yyyyMMdd_HHmmss", CultureInfo.InvariantCulture), 
      x.SensorNumber 
     }) 
     .Where(x => x.StartDate != null && x.StartDate >= startDate && x.StartDate <= endDate) 
     .ToList(); 
+0

DateTime.ParseExact не будет переведен на T-SQL! – Roman

+0

, поэтому вам нужно добавить представление в соответствии с вашим желаемым sql, а затем импортировать его в свою модель, тогда вы очень хорошо пробуйте свой предыдущий код –

Смежные вопросы