O membro do tipo especificado 'Data' não é suportado no LINQ to Entities. Somente inicializadores, membros da entidade e propriedades de navegação da entidade

138

Usando esse código no Entity Framework , recebo o seguinte erro. Eu preciso obter todas as linhas para uma data específica, DateTimeStarté do tipo DataType neste formato2013-01-30 12:00:00.000

Código:

 var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                    .Where(x =>  x.DateTimeStart.Date == currentDateTime.Date);

Erro:

base {System.SystemException} = {"O tipo de membro especificado 'Data' não é suportado no LINQ to Entities. Somente inicializadores, membros da entidade e propriedades de navegação da entidade são suportadas."}

Alguma idéia de como consertar isso?

GibboK
fonte
Eu sou capaz de usar x.DateTimeStart.Date na EF Núcleo 2.1.1
Kirsten Greed

Respostas:

271

DateTime.Datenão pode ser convertido para SQL. Use o método EntityFunctions.TruncateTime para obter a parte da data.

var eventsCustom = eventCustomRepository
.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
.Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);

ATUALIZAÇÃO: Como o @shankbond mencionado nos comentários, o Entity Framework 6 EntityFunctionsé obsoleto e você deve usar a DbFunctionsclasse que é fornecida com o Entity Framework.

Sergey Berezovskiy
fonte
1
Eu tenho que modificar sua versão .Where (x => EntityFunctions.TruncateTime (x.DateTimeStart) == currentDate.Date); deixe-me saber seus thougs
GibboK
1
Eu espero que você não se importa que eu tenho editar sua resposta adicionando .date se você concorda, por isso apenas para referência :-) obrigado por seu apoio, eu realmente aprecio isso
GibboK
1
@ GibboK com certeza, não há problema :) Isso foi apenas para o propósito de formatar uma string longa.
Sergey Berezovskiy 30/01
68
EntityFunctions é obsoleto, em vez usar o método DbFunctions.TruncateTime
shankbond
1
O membro do tipo especificado 'Data' não é suportado no LINQ to Entities. Apenas inicializadores, membros da entidade e propriedades de navegação da entidade são suportados.
SAR
83

Agora você deve usar DbFunctions.TruncateTime

var anyCalls = _db.CallLogs.Where(r => DbFunctions.TruncateTime(r.DateTime) == callDateTime.Date).ToList();
WaZ
fonte
O membro do tipo especificado 'Data' não é suportado no LINQ to Entities. Apenas inicializadores, membros da entidade e propriedades de navegação da entidade são suportados.
SAR
17

Eu gostaria de adicionar uma solução que me ajudou a resolver esse problema na estrutura da entidade:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                .Where(x =>  x.DateTimeStart.Year == currentDateTime.Year &&
                             x.DateTimeStart.Month== currentDateTime.Month &&
                             x.DateTimeStart.Day == currentDateTime.Day
    );

Espero que ajude.

jvrdelafuente
fonte
15

EntityFunctionsé obsoleto. Considere usar em seu DbFunctionslugar.

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
   .Where(x => DbFunctions.TruncateTime(x.DateTimeStart) == currentDate.Date);
Leonel Sanches da Silva
fonte
8

Sempre use EntityFunctions.TruncateTime () para x.DateTimeStart e currentDate. tal como :

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).Where(x => EntityFunctions.TruncateTime(x.DateTimeStart) == EntityFunctions.TruncateTime(currentDate));
Babul Mirdha
fonte
5

Basta usar propriedades simples.

var tomorrow = currentDateTime.Date + 1;  
var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference)
                            .Where(x =>  x.DateTimeStart >= currentDateTime.Date 
                                   and x.DateTimeStart < tomorrow);

Se datas futuras não forem possíveis no seu aplicativo, > = x.DateTimeStart> = currentDateTime.Date será suficiente.

se você tiver comparações de datas mais complexas, verifique as funções canônicas e se você possui funções EF6 + DB

Mais geralmente - Para pessoas que procuram problemas Os métodos Linq suportados no EF podem explicar problemas semelhantes com instruções linq que funcionam nas listas de base de memória, mas não no EF.

phil soady
fonte
3

Simplificado:

DateTime time = System.DateTime.Now;
ModelName m = context.TableName.Where(x=> DbFunctions.TruncateTime(x.Date) == time.Date)).FirstOrDefault();
devlin carnate
fonte
2

Use o código abaixo para usar o EF6:

(DbFunctions.TruncateTime(x.User.LeaveDate.Value)
Abdus Salam Azad
fonte
0

Outra solução poderia ser:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
cozmin-calin
fonte