2015-05-14 2 views
6

В LINQ Я хочу сделать THW следовать запрос:LINQ к Entities не распознает метод «System.DateTime ToDateTime (System.String)»

_tareaRepositorio.ObtenerTodo() 
    .Where(
    x => 
    Convert.ToDateTime(x.FechaCreacion.ToString("d")) >= fechaInicial && 
    Convert.ToDateTime(x.FechaCreacion.ToString("d")) <= fechaFinal).ToList(); 

Но, в момент выполнения запроса появляется последующее ошибка:

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

Как я могу это исправить?

EDIT

Беда в том, что мне нужно сравнивать только дату, но не время ...

+0

Какой тип 'x.FechaCreacion'? –

+2

Не пытайтесь преобразовать дату в строку и затем снова проанализировать ее до даты; просто используйте исходную дату в качестве даты. – Servy

+1

EF не знает, как преобразовать 'ToDateTime()' в действительный SQL-запрос. –

ответ

5

Попробуйте

EDIT: Добавить DbFunctions.TruncateTime(), чтобы получить желаемый эффект

_tareaRepositorio.ObtenerTodo() 
    .Where(x => DbFunctions.TruncateTime(x.FechaCreacion) >= fechaInicial && 
       DbFunctions.TruncateTime(x.FechaCreacion) <= fechaFinal) 
    .ToList(); 

Исключение вы получаете, потому что Convert.ToDateTime является метод .NET, который не может быть преобразован в SQL. Как правило, это должно быть сделано после того, как запрос был материализовался (т.е. с использованием .ToList() до Where), но в вашем конкретном случае это unnecesary так DateTime объекты могут быть сравнены с использованием >= и <= и Entity Framework может преобразовать его в SQL успешно

Теперь, если вы хотите сравнить только дату в Datetime, вы можете использовать метод DbFunctions.TruncateTime(), который живет в пространстве имен System.Data.Entity. Этот метод позволит EF правильно усекать дату в SQL

+0

Troube - это то, что мне нужно сравнить только дату, а не время ... Как вы предположим, что я буду сравнивать дату и время с датой и, как это, я буду потерять данные ... –

+0

@FreddyCastelblancoMacias Пожалуйста, включите это в свой вопрос, также я обновил ответ –

+0

Спасибо, он работает отлично! –

1

Если вы хотите, чтобы получить объекты между двумя датами, сравнить, как даты:

var result = content.Table.Where(x => x.date >= startDate 
           && x.date <= endDate) 
          .ToList(); 

, где startDate и endDate оба являются DateTime.

Преобразование в строки означает, что вы находитесь во власти текущих настроек культуры (локали). С инвариантной культурой формат даты по умолчанию - американский, поэтому они не сравнивают лексикографически с любым полезным смыслом.

+0

Преобразование в строки * просто не работает *, как указано ошибкой, получаемой OP ... – Servy

0

Вернуть результат с помощью AsEnumerable(), а затем преобразовать его в список.

Будет работать, я столкнулся с той же проблемой, что и вы, это решение могло бы работать.

Смежные вопросы