Ryan Zahra Ответов: 1

Fluent nhibernate: добавление даты


Используя Fluent NHibernate, я хотел бы проверить будущую дату с датой give. Для простоты я сократил свой код до минимума ниже. Свойство " MyDate "сопоставляется столбцу в Sql Server типа"Date". Однако я попробовал тот же код ниже, используя Sql-тип "DateTime", но все равно получил тот же результат. Я пытаюсь использовать приведенный ниже код:

var myTbl = IQuerable<mytable>();
var result = myTbl.Where(x => SqlFunctions.DateAdd("month", 6, x.MyDate).Value <= DateTime.Now);


Ошибка не выбрасывается, однако во время отладки, Когда я пытаюсь увидеть представление результата переменной result, я вижу следующее В окне наблюдения "{"PartialEvalException (NotSupportedException (\"эта функция может быть вызвана только из LINQ to Entities.\ "), DateAdd (\"dd\", 6, 31/10/2016 20:33:05))"} система.SystemException {System.исключение NotSupportedException}"

Любая помощь будет очень признательна!

Что я уже пробовал:

Я попробовал варианты вышеизложенного со следующим кодом, однако весь код привел к ошибкам, которые были выброшены в NHibernate.

var result1 = myTable.Where(x => SqlFunctions.DateAdd("month", 6, x.MyDate) <= DateTime.Now);

var result2 = myTable.Where(x => SqlFunctions.DateAdd("month", 6, DateTime.Now) <= DateTime.Now);

var result3 = myTable.Where(x => SqlFunctions.DateAdd("month", 6, x.MyDate) != null && SqlFunctions.DateAdd("month", 6, x.MyDate) <= DateTime.Now);

var result4 = myTable.Where(x => EntityFunctions.AddMonths(x.myDate, 6) <= DateTime.Now);

1 Ответов

Рейтинг:
9

Richard Deeming

То SqlFunctions будет работать только с LINQ to SQL; EntityFunctions может быть вызван только из Entity Framework.

Если вы хотите вызвать определенную функцию из NHibernate, то вам нужно будет создать собственный диалект:
Чистый точечный сетевой кодер: использование DateAdd с NHibernate Linq[^]

Кроме того, измените свои критерии:

var maxDate = DateTime.Now.AddMonths(-6);
var result1 = myTable.Where(x => x.MyDate <= maxDate);

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


Ryan Zahra

Спасибо за быстрый ответ. Изменение критериев повлияет на мои результаты, так что, скорее всего, я буду использовать пользовательский диалект. Но до этого нет ли какого-нибудь" более простого " способа просто добавить дату для моего запроса?

Richard Deeming

Почему это повлияет на ваши результаты? MyDate + 6 months <= Today это точно то же самое, что MyDate <= Today - 6 months.

Ryan Zahra

Ты прав насчет этого, моя ошибка! Большое спасибо за вашу помощь! Я прослежу за этим и проверю его еще раз. Еще раз спасибо!