Использование DateTime в динамическом LINQ для объектов - PullRequest
6 голосов
/ 09 февраля 2011

Я использую LINQ to Entities для получения дат покупки предметов следующим образом:

where EntityFunctions.TruncateTime(order.PurchaseDate) == myPurchaseDate.date

Ключ здесь заключается в том, что столбец DB содержит дату и время, поэтому время для сравнения должно быть убрано.Этот код работает нормально.

Теперь я хочу сделать то же самое, используя динамический LINQ to Entities.Я использую dynamic.cs из папки примеров кода VS2010.Когда я кодирую:

.where("EntityFunctions.TruncateTime(PurchaseDate) == @0", myPurchaseDate.date);

или любой другой вариант, я получаю сообщение об ошибке.Что мне нужно кодировать как строковое значение, чтобы эта работа работала?(Так как я могу использовать .StartsWith или .Contains внутри строки, я надеюсь, что есть какая-то функция даты, которую динамический LINQ распознает).

Я знаю, что могу создать динамический запрос LINQ в качестве диапазона дат, концептуально

PurchaseDate >= myPurchaseDate@midnight and PurchaseDate <= myPurchaseDate+23:59:59

Фактически, возможно, диапазон дат более эффективен с точки зрения SQL Server, но я хотел бы знать, существует ли что-то вроде TruncateTime или ToShortDate в Dynamic LINQ to Entities.

Ответы [ 4 ]

12 голосов
/ 18 мая 2011

Я недавно начал использовать динамический linq для проекта, а также хотел сравнить даты без компонента времени.Динамический пример кода Linux Linq C # (Dynamic.cs) поддерживает фиксированный набор типов, и EntityFunctions не является одним из них.

Но, немного поэкспериментировав, я обнаружил, что просто добавив EntityFunctions для массива предопределенных типов позволяет использовать TruncateTime и, вероятно, другие EntityFunctions методы тоже.

Вот что предопределенные типы Dynamic.csМассив выглядит как в моем проекте:

static readonly Type[] predefinedTypes = {
    typeof(Object),
    typeof(Boolean),
    typeof(Char),
    typeof(String),
    typeof(SByte),
    typeof(Byte),
    typeof(Int16),
    typeof(UInt16),
    typeof(Int32),
    typeof(UInt32),
    typeof(Int64),
    typeof(UInt64),
    typeof(Single),
    typeof(Double),
    typeof(Decimal),
    typeof(DateTime),
    typeof(TimeSpan),
    typeof(Guid),
    typeof(Math),
    typeof(Convert),
    typeof(System.Data.Objects.EntityFunctions)             // JimM
};

С помощью этого измененного файла Dynamic.cs я могу создавать динамические запросы linq, включая выражения, подобные примеру PurchaseDate в вашем вопросе.

2 голосов
/ 09 февраля 2011

Если ваши запросы будут часто выполнять поиск только по аспекту даты, другой подход, который следует рассмотреть, если он доступен в вашей базе данных SQL Server, заключается в избыточном хранении усеченной версии столбца datetime в виде столбца даты. Смотри http://msdn.microsoft.com/en-us/library/bb630352.aspx).

Тогда все ваши запросы могут работать лучше, потому что нет необходимости в преобразованиях, они менее подвержены ошибкам разработчика. И их проще запрашивать в простом старом SQL.

Ваши запросы EF будут затем запрашивать в столбце даты SQL Server

0 голосов
/ 09 февраля 2011

Вот ссылка, которая перечисляет функции EF4, которые сопоставляются с функциями sql

Концептуальная модель Каноническое сопоставление функций SQL Server

0 голосов
/ 09 февраля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...