web-dev-qa-db-fra.com

Comment effectuer une comparaison de date dans une requête EF?

S'il vous plaît, aidez-moi ... J'essaie de comprendre comment utiliser DATE ou DATETIME à des fins de comparaison dans une requête linq.

Exemple: Si je voulais tous les noms d'employé pour ceux qui ont commencé avant aujourd'hui, je ferais quelque chose comme ceci en SQL:

SELECT EmployeeNameColumn
FROM EmployeeTable
WHERE StartDateColumn.Date <= GETDATE() //Today

Mais qu'en est-il de linq?

DateTime startDT = //Today

var EmployeeName =  
from e in db.employee
where e.StartDateColumn <= startDT 

Ce qui précède OERE ne fonctionne pas: 

Détails de l'exception: System.NotSupportedException: le type de membre spécifié 'Date' n'est pas pris en charge dans LINQ to Entities. Seuls les initialiseurs, les membres d'entité et les propriétés de navigation d'entité sont pris en charge.

45
Kam

Cela devrait fonctionner. Êtes-vous sûr qu'il n'y a pas une autre partie de la requête qui a déclenché l'exception? J'ai plusieurs instances de requêtes de la forme

var query = from e in db.MyTable
            where e.AsOfDate <= DateTime.Now.Date
            select e;

dans mon code.

18
jason

Utilisez la classe DbFunctions pour couper la partie temps.

using System.Data.Entity;

var bla = (from log in context.Contacts
           where DbFunctions.TruncateTime(log.ModifiedDate) 
                              ==  DbFunctions.TruncateTime(today.Date)
           select log).FirstOrDefault();

Source: http://social.msdn.Microsoft.com/Forums/fr/csharpgeneral/thread/84d4e18b-7545-419b-9826-53ff1a0e2a62/

70
Mandeep Janjua

Cela peut être dû à la date nullable de la date dans la base de données. Essaye ça:

var EmployeeName =
from e in db.employee
where e.StartDateColumn.Value <= startDT 
10
Shiraz Bhaiji

Vous pouvez vérifier l'état comme ça

var nextDay = DateTime.Today.AddDays(1);

var query = from e in db.MyTable
            where e.AsOfDate >= DateTime.Today && e.AsOfDate < nextDay 
            select e;

ici, vous obtiendrez les enregistrements de la date AsOfDate. En vérifiant entre aujourd'hui (00:00:00) et demain (00:00:00), nous n'obtiendrons un enregistrement de la date d'aujourd'hui que pour ce qui pourrait être l'heure ...

8
Ejaz

Vous ne pouvez pas utiliser .Date

Si vous souhaitez vérifier aujourd'hui, vous pouvez créer un datetime sans heure.

DateTime myDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day);
var e = (from mds in myEntities.Table
         where mds.CreateDateTime >= myDate
         select mds).FirstOrDefault();
5
Ane

essaye ça: 

DateTime dd = DateTime.Parse("08/13/2010 00:00:00");
var data = from n in ContributionEligibilities
           where n.ModifiedDateTime.Date >= DateTime.Parse("08/13/2010").Date
           select n; 
data.Dump("Result") ;
2
Yousuf Qureshi

Je suis curieux de voir le message d'erreur disant 'Date', lorsque vous passez un 'DateTime'. Serait-ce que 'StartDateColumn' est en réalité un 'Date', plutôt qu'un 'DateTime' dans la base de données? Cela pourrait gâcher la comparaison ...

2
David Hedlund

utilisez une variable locale pour stocker la valeur Date, puis utilisez cette variable dans la requête:

DateTime today = DateTime.Now.Date; from scheme in context.schemes where scheme.EndDate > today select scheme

1
Niraj

J'utilise un LinqDataSource et j'ai eu des problèmes pour que ma requête contenant une comparaison de dates s'exécute sans erreur. La solution consiste à utiliser la fonction WhereAddParameters et à ajouter la valeur de test en tant que paramètre fortement typé. 

Voir l'exemple ci-dessous où je fais correspondre un groupid et vérifie si la StopDate de mon enregistrement est supérieure ou égale à l'horodatage date/heure actuel. 

J'utilise actuellement ce fragment de code et cela fonctionne à merveille.

LinqCampaigns.WhereParameters.Add("StopDate", System.Data.DbType.Date, DateTime.Now.ToString())
LinqCampaigns.Where = "GroupId = " & myGrp & " &&  " & "StopDate >= @StopDate"

Fonctionne comme un charme ....

1
Les

assurez-vous de vérifier la valeur NULL comme ceci:

 '(from mm in _db.Calls 
   where mm.Professionnal.ID.Equals(proid)
   && mm.ComposedDate.HasValue &&
   (mm.ComposedDate.Value >= datemin) && (mm.ComposedDate.Value <= date)
   select mm).ToArray();'
0
isambert

Date n'a pas fonctionné, mais. Jour a fait pour moi.

var query = from o in Payments
    where o.Order.OrderDate.Day != o.PaymentDate.Day
    orderby o.Order.OrderDate
    select new
    {
     o.Order.OrderID,
     o.Order.OrderDate,
     o.PaymentDate,      
     o.Order.FirstName,
     o.Order.LastName,
     o.Order.CustomerID
    };


query.Dump();
0
ADBatBWD