Как преобразовать строку в DateTime в где Clause?

1

Мне нужно сравнить выбранную дату из календаря (startdat & enddat) с датой в моей базе данных SQL 2008 R2. Я должен написать его с LINQ, но в представлении, которое у меня есть, DateTime преобразуется в String (Varchar), поэтому мне нужно преобразовать его в свой запрос LINQ Query обратно в DateTime. Мой основной запрос выглядит следующим образом:

var reportlist = (from r in context.Monthly_Report
                  where r.CreateDate >= startdat && r.CreateDate <= enddat
                  select r.Ticketnumber).ToList();

Итак, CreateDate я получаю String и для сравнения я должен ее преобразовать. Я пробовал это с Convert.ToDateTime() но есть проблема с L2E. Итак, как я могу преобразовать его, как в SQL Script, или что SQL знает, что я имею в виду?

Спасибо за каждую помощь, которую я получаю. (btw мне не разрешено изменять представление)

  • 4
    Есть ли способ, которым вы можете изменить вид? Это не просто вопрос LINQ - по сути, если поле является датой, его не следует возвращать в виде строки.
  • 2
    @mxmissile Кто-то принимает плохое дизайнерское решение, так что теперь вы выступаете за его увольнение? Тебе не кажется, что это немного резко? Понятно, что это плохая идея, но каждый проходит много плохих идей, когда они учатся
Показать ещё 11 комментариев
Теги:
linq
entity-framework

2 ответа

3
Лучший ответ

Вы можете использовать только уменьшенный набор функций в Linq для Entities. Эти функции будут транслироваться на функции БД.

Вы можете использовать:

Ни одна из этих групп не включает функцию, которая может конвертировать из строки в datetime, поэтому нет никакого способа сделать это напрямую.

Вы должны искать альтернативы:

  • Создайте представление БД, которое предоставляет "строковое" datetime как datetimecolumn и запрашивает его
  • Создайте сохраненную процедуру и используйте ее
  • Преобразуйте datetime в строку и сравните ее, если это вообще возможно (это зависит от того, как выглядит "строковое" время datetime)
  • Вы можете использовать предыдущее решение, используя подстроки (которые будут отображаться в функциях БД). Это будет работать во всех случаях: переупорядочивать y, m, d из "строковой" даты dt, чтобы она выглядела как "yyyymmdd". Затем преобразуйте startdat и enddat в тот же формат и сравните его в enddat (буквенном) порядке.
1

По сути, вам нужно ваше мнение, чтобы вернуть дату и время.

Однако есть несколько способов сделать это.

1) Вы можете вытащить свои данные в виде строки в объект списка. Тогда вы не будете использовать L2E.

var temp = (from r in context.Monthly_Report
            select new { r.Ticketnumber,  r.CreateDate} ).ToList();
var reportList = temp.Where(r =>  
                            Convert.ToDateTime(r.CreateDate) >= startdat && 
                            Convert.ToDateTime(r.CreateDate) <= enddat)

2) Вы можете преобразовать свое время в строку и сравнить его.

var reportlist = (from r in context.Monthly_Report
                  where r.CreateDate.CompareTo(startdatasstring) >= 0 && 
                        r.CreateDate.CompareTo(enddatasstring)  <= 0
                  select r.Ticketnumber).ToList();
  • 0
    Что делать, если есть миллионы строк? ты только что убил его приложение
  • 0
    @mxmissile, моя первая строка - настоящий ответ. Существует большая проблема с обработкой данных. Тем не менее, если у него нет выбора, это альтернативы.
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню