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?


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.


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();


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.


15

EntityFunctionsé obsoleto. Considere usar em seu DbFunctionslugar.

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

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));

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.


3

Simplificado:

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

2

Use o código abaixo para usar o EF6:

(DbFunctions.TruncateTime(x.User.LeaveDate.Value)

0

Outra solução poderia ser:

var eventsCustom = eventCustomRepository.FindAllEventsCustomByUniqueStudentReference(userDevice.UniqueStudentReference).AsEnumerable()
   .Where(x => x.DateTimeStart.Date == currentDate.Date).AsQueryable();
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.