разница в дате в EF4 - PullRequest
       1

разница в дате в EF4

1 голос
/ 26 октября 2010

мне нужно получить разницу двух дат, одной даты из таблицы и одной текущей даты, и разница должна быть меньше 9 дней. мне нужно использовать это в качестве фильтра в где пункт о Linq я пытался сделать это

var list = из p в context.persons где ((p.CreateDT) .Subtract (DateTime.Now) .Days <90) выберите p; </p>

я получаю это исключение:

LINQ to Entities не распознает метод метода System.TimeSpan Subtract (System.DateTime), и этот метод нельзя преобразовать в выражение хранилища.

Я исследовал другие статьи, но ничего не помогло .. Любые идеи

Ответы [ 4 ]

4 голосов
/ 26 октября 2010

Хитрость здесь в том, что она не может перевести все ваши фантазии оооооооооооооооооооооооооооооо «на старый»Хитрость заключается в том, чтобы перевернуть его с ног на голову:

var before = DateTime.Now.AddDays(-90);
var persons = context.Persons.Where(x => x.CreateDT > before);

ОБЪЯСНЕНИЕ

Помните, что все в бите WHERE вашего оператора LINQ должно быть переведено из C # в SQL EF.Он очень, очень способен из коробки и обрабатывает большинство основных задач, но он не знает, как понимать самые элементарные вызовы методов, такие как DateTime.Subtract ().Таким образом, идея здесь состоит в том, чтобы позволить ему делать то, что он делает лучше всего, предварительно вычисляя значение и затем передавая его на уровень данных.

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

Вторая строка должна переводиться в SQL, ГДЕ CreateDT> @ BEFORETHIS

2 голосов
/ 26 октября 2010

Обновление

Кажется, что EF не поддерживает вычитание дат и возврат TimeSpan.Вот один из способов решения проблемы:

DateTime oldestDate = DateTime.Now.AddDays(-90); 
var list = from p in context.persons 
           where p.CreateDT >= oldestDate
           select p;

См. этот поток в Stackoverflow.

1 голос
/ 12 июля 2011

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

0 голосов
/ 26 октября 2010

Попробуйте сделать просто (p.CreateDate - DateTime.Now).Days < 90. Вместо вызова DateTime.Subtract (). В некоторых случаях операторные перегрузки реализуются для Entity Framework, даже если соответствующие именованные методы - нет.

Если это не сработает, вы можете вместо этого использовать ESQL или хранимую процедуру. В качестве окончательного грязного решения вы можете вызвать context.persons.ToList(), а затем вызвать DateTime.Subtract ().

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