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.
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.
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();
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
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 ...
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();
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") ;
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 ...
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
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 ....
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();'
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();