Возврат результатов БД в диапазоне дат

На мой взгляд, у меня есть ввод и выбор тегов, чтобы пользователь мог ввести дату начала и окончания. При отправке контроллер будет искать модель/базу данных и возвращать записи в указанном выше диапазоне.

В моей БД даты начала и окончания записываются как «nvarchars», а в моем контроллере они воспринимаются как строки.

Код и изображения для справки:

public ActionResult timePeriod(string time)
{
    //Start: month, day, year End: month, day, year --> Numeric values
    string[] times = time.Split(',');                             
    string start = times[0] + " " + times[1] + " " + times[2];
    string end = times[3] + " " + times[4] + " " + times[5];

    //Sample code to test the start date
    viewModel.Tasks = db.Tasks.Where(s => s.StartTime.Contains(start)).ToList();
}

фрагмент значений базы данных:

введите здесь описание изображения

Есть ли какое-нибудь выражение LINQ для этого?


person Stephen Sugumar    schedule 01.12.2014    source источник
comment
Почему даты не сохраняются как datetime? Кажется необычным хранить их как nvarchar   -  person Jason Evans    schedule 01.12.2014
comment
к сожалению, я не могу изменить базу данных, поэтому мне приходится иметь дело с датами, являющимися varchars   -  person Stephen Sugumar    schedule 01.12.2014


Ответы (1)


Поскольку даты являются строками, у вас нет ничего лучше, чем использовать то, что вы уже предложили:

viewModel.Tasks = db.Tasks.Where(s => s.StartTime.Equals(start)).ToList();

Я бы использовал Equals, так как это будет быстрее для вас. Использование Contains в основном похоже на выполнение T-SQL LIKE, которое намного медленнее.

SELECT *
FROM Table
WHERE StartDate LIKE 'blah'

Использование Equals приведет к следующему эквиваленту:

SELECT *
FROM Table
WHERE StartDate = 'blah'

Что гораздо эффективнее.

person Jason Evans    schedule 01.12.2014
comment
Хорошо, спасибо за ответ, возможно, мне нужно поговорить с администраторами БД, чтобы изменить тип дат. - person Stephen Sugumar; 01.12.2014
comment
Я бы предложил сделать это, поскольку эти даты имеют смысл быть datetime значениями. Однако, если база данных уже создана и используется, то изменение типа может быть уже слишком поздно. - person Jason Evans; 01.12.2014
comment
ну, проект все еще находится в разработке, поэтому стоит спросить, потому что я могу представить, что логика будет сложной, чтобы получить все записи БД между датами. - person Stephen Sugumar; 01.12.2014
comment
Вы попали в точку. С nvarchar вы не могли легко получить диапазон дат между двумя датами. - person Jason Evans; 01.12.2014