Estou tendo dois valores de data, um já armazenado no banco de dados e outro selecionado pelo usuário usando DatePicker. O caso de uso é pesquisar uma data específica no banco de dados.
O valor previamente inserido no banco de dados sempre tem componente de tempo de 12:00:00, sendo que assim como a data inserida no selecionador tem componente de tempo diferente.
Estou interessado apenas nos componentes de data e gostaria de ignorar o componente de tempo.
Quais são as maneiras de fazer essa comparação em C #?
Além disso, como fazer isso no LINQ?
ATUALIZAÇÃO: No LINQ to Entities, o seguinte funciona bem.
e => DateTime.Compare(e.FirstDate.Value, SecondDate) >= 0
c#
linq
entity-framework
linq-to-entities
datetime-comparison
lâmina de lápis
fonte
fonte
Respostas:
NOTA: no momento em que escrevi esta resposta, a relação EF não era clara (que foi editada na pergunta depois que ela foi escrita). Para uma abordagem correta com EF, verifique a resposta do Mandeeps .
Você pode usar a
DateTime.Date
propriedade para realizar uma comparação apenas de data.fonte
EntityFunctions.TruncateTime
certamente parece ser o caminho a percorrer hoje em dia (tornou-se disponível no .NET 4, que foi lançado um ano após essa pergunta ser feita).Use a classe
EntityFunctions
para aparar a parte do tempo.Fonte: http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/
ATUALIZAR
A partir do EF 6.0 e posterior, EntityFunctions foi substituído por DbFunctions .
fonte
EntityFunctions
foi substituída em favor deSystem.Data.Entity.DbFunctions
(pelo menos) EF6. Pode ter sido antes disso.Eu acho que isso pode te ajudar.
Fiz uma extensão, pois tenho que comparar datas em repositórios preenchidos com dados EF e, portanto, .Date não era uma opção, pois não é implementado na tradução de LinqToEntities.
Aqui está o código:
então você pode usá-lo desta forma.
fonte
Se você usar a
Date
propriedade para Entidades de banco de dados, obterá exceção:Você pode usar algo assim:
fonte
Fazê-lo em LINQ to Entities, você tem que usar métodos suportados :
Feio, mas funciona e é feito no servidor de banco de dados.
fonte
Esta é uma maneira diferente de fazer isso, mas só é útil se SecondDate for uma variável que você está passando:
Acho que deve funcionar
fonte
DateTime = x.Date;
que estava faltando. Se eu useivar
, ou teve o valor embutido na comparação, ele falhou com a exceção relatada. Obrigado.e.FirstDate.Value <= endDate
para,e.FirstDate.Value < endDate
poderá remover o.AddTicks(-1)
.Você também pode usar isto:
DbFunctions.DiffDays(date1, date2) == 0
fonte
você pode usar o método DbFunctions.TruncateTime () para isso.
fonte
Basta sempre comparar a propriedade Date de DateTime, em vez da data e hora completa.
Ao fazer sua consulta LINQ, use date.Date na consulta, ou seja:
fonte
candidate.Date >= base.Date
. Teoricamente, ocandidate.Date
tempo deve ser> = 12:00:00, então usar a propriedade Date é redundante, mas vou seguir o conselho de Reed.É assim que eu faço isso.
fonte
// Nota para usuários / codificadores do Linq
Isso deve fornecer a comparação exata para verificar se uma data está dentro do intervalo ao trabalhar com a entrada de um selecionador de data do usuário, por exemplo:
onde startdate e enddate são valores de um selecionador de data.
fonte
Sem tempo, tente assim:
fonte
Você pode usar o link abaixo para comparar 2 datas sem tempo:
a função Compare retorna 3 valores diferentes: -1 0 1 que significa dt1> dt2, dt1 = dt2, dt1
fonte
Tente isto ... Funciona bem comparar propriedades de Date entre dois tipos de DateTimes:
PS. É uma solução paliativa e uma prática muito ruim, nunca deve ser usada quando você sabe que o banco de dados pode trazer milhares de registros ...
fonte