Динамический LINQ с датой и временем

Я пытаюсь написать простой запрос выбора linq, где в предложении where значение берется из текстового поля. У меня проблема со значениями даты и времени. Теперь это работает:

 var rawData = contextSearch.GetType().GetProperty(TableName).GetValue(contextSearch, null);
 truncatedData = ((IQueryable<object>)rawData).Where(columnName + ">=@0", DateTime.Parse(txtCrudSearch.Text)).ToList();

это также работает для ‹=, но мне нужно найти записи точно на заданную дату. Итак, когда я пробую это:

truncatedData = ((IQueryable<object>)rawData).Where(columnName + "=@0", DateTime.Parse(txtCrudSearch.Text)).ToList();

Не работает. Почему? Как я могу заставить это работать? К вашему сведению: имя столбца динамически берется из поля со списком, и я использую структуру сущностей.


person Paradox    schedule 09.02.2015    source источник
comment
Он не показывает никаких ошибок, но и ничего не возвращает. У меня нет записей, когда я его запускаю.   -  person Paradox    schedule 09.02.2015
comment
Имеет ли значение даты, которое вы извлекаете из текстового поля, компонент времени? Используемый вами запрос будет работать только в том случае, если дата точно соответствует значению в базе данных (включая время).   -  person Ash8087    schedule 09.02.2015
comment
Я никогда не использовал LINQ таким образом, но не должно быть, .Where (columnName + == @ 0,   -  person Dawood Awan    schedule 09.02.2015
comment
это тоже не работает @DawoodAwan   -  person Paradox    schedule 09.02.2015
comment
@ Ash8087 да, у него есть временная составляющая, что мне тогда делать? Я даю время в поисковом значении - точно так же, как в базе данных, в этом случае оно тоже не работает.   -  person Paradox    schedule 09.02.2015
comment
Вы пытаетесь получить записи по дням / месяцам / годам? Существует очень небольшая вероятность того, что какая-то запись будет точно соответствовать предоставленному полному DateTime.   -  person haim770    schedule 09.02.2015
comment
Почему вы не используете деревья выражений для построения динамических запросов?   -  person tdbeckett    schedule 09.02.2015
comment
@ haim770 Я хочу найти записи по дате, поэтому я попытался написать запрос с помощью contains, но не смог заставить его работать со значением даты.   -  person Paradox    schedule 09.02.2015
comment
Вы можете изменить запрос для сравнения значений int вместо дат в целях тестирования. Таким образом, вы можете увидеть, является ли проблема синтаксическим анализом dateTime / в самом запросе?   -  person Niels Filter    schedule 09.02.2015
comment
@DawoodAwan Нет, это буквальный код SQL, используемый dynamic-linq, а SQL использует один = для равенства.   -  person juharr    schedule 09.02.2015
comment
@filtered Я использую тот же запрос для значений типа int, string. Я заставил их работать, кроме значения даты. Запрос в порядке.   -  person Paradox    schedule 09.02.2015
comment
Понятно, попробуйте записать нужный запрос непосредственно в SQL (или в любую другую базу данных, которую вы используете), и сначала посмотрите, как получите правильные результаты, а затем вернитесь к динамическому запросу. Поправьте меня, если я ошибаюсь, но, похоже, вы сравниваете объект с datetime, может ли это быть проблемой?   -  person Niels Filter    schedule 09.02.2015
comment
Он должен работать до тех пор, пока время одинаковое. Есть ли у значений в вашей базе данных временные компоненты? Возможно, эти значения имеют более детализированное значение времени (например, значение в миллисекундах), но анализируемое значение (из вашего текстового поля) - нет. Вы можете просто выполнить поиск по части «Дата» (игнорируя время), если это окажется проблемой. Для этого вы можете преобразовать DateTime с каждой стороны выражения в Midnight.   -  person Ash8087    schedule 09.02.2015


Ответы (1)


Если вы хотите только сравнить дату и игнорировать время, попробуйте следующее:

var parsedDt = DateTime.Parse(txtCrudSearch.Text);
var nextDay = parsedDt.AddDays(1);

truncatedData = ((IQueryable<object>)rawData)
                 .Where(columnName + ">= @0 && " + columnName + " < @1", parsedDt, nextDay)
                 .ToList();

(Это решение основано на @algreat ответе)

person haim770    schedule 09.02.2015