Bitte helfen Sie ... Ich versuche herauszufinden, wie DATE oder DATETIME zum Vergleich in einer Linq-Abfrage verwendet werden.
Beispiel: Wenn ich alle Mitarbeiternamen für diejenigen suchen wollte, die vor heute angefangen haben, würde ich in SQL Folgendes tun:
SELECT EmployeeNameColumn
FROM EmployeeTable
WHERE StartDateColumn.Date <= GETDATE() //Today
Aber was ist mit linq?
DateTime startDT = //Today
var EmployeeName =
from e in db.employee
where e.StartDateColumn <= startDT
Das obige WO funktioniert nicht:
Ausnahmedetails: System.NotSupportedException: Der angegebene Typ Member 'Date' wird in LINQ to Entities nicht unterstützt. Es werden nur Initialisierer, Entitätsmitglieder und Entitätennavigationseigenschaften unterstützt.
Das sollte funktionieren. Sind Sie sicher, dass es keinen anderen Teil der Abfrage gibt, der die Ausnahme ausgelöst hat? Ich habe mehrere Fälle von Abfragen des Formulars
var query = from e in db.MyTable
where e.AsOfDate <= DateTime.Now.Date
select e;
in meinem Code.
Verwenden Sie die Klasse DbFunctions
, um den Zeitanteil zu kürzen.
using System.Data.Entity;
var bla = (from log in context.Contacts
where DbFunctions.TruncateTime(log.ModifiedDate)
== DbFunctions.TruncateTime(today.Date)
select log).FirstOrDefault();
Möglicherweise ist das Datum in der Datenbank nullfähig. Versuche dies:
var EmployeeName =
from e in db.employee
where e.StartDateColumn.Value <= startDT
Sie können den Zustand so überprüfen
var nextDay = DateTime.Today.AddDays(1);
var query = from e in db.MyTable
where e.AsOfDate >= DateTime.Today && e.AsOfDate < nextDay
select e;
hier erhalten Sie die Aufzeichnungen zum AsOfDate-Datum, während wir zwischen heute (00:00:00) und morgen (00:00:00) prüfen, dass wir nur das Datum des heutigen Datums erhalten.
Sie können .Date nicht verwenden
Wenn Sie nach heute suchen möchten, können Sie eine Datumszeit ohne Zeitangabe erstellen
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();
versuche dies:
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") ;
Ich bin neugierig auf die Fehlermeldung 'Date'
, wenn Sie einen 'DateTime'
übergeben. Könnte es sein, dass 'StartDateColumn'
tatsächlich ein 'Date'
ist und nicht ein 'DateTime'
in der Datenbank? Das könnte den Vergleich stören ...
verwenden Sie eine lokale Variable, um den Date-Wert zu speichern, und verwenden Sie diese Variable dann in der Abfrage:
DateTime today = DateTime.Now.Date;
from scheme in context.schemes
where scheme.EndDate > today
select scheme
Ich verwende eine LinqDataSource und hatte Probleme damit, meine Abfrage mit einem Datumsvergleich darin fehlerfrei auszuführen. Die Antwort besteht darin, die WhereAddParameters-Funktion zu verwenden und den Testwert als stark typisierten Parameter hinzuzufügen.
Im folgenden Beispiel werde ich mit einer Groupid abgeglichen und nachsehen, ob das StopDate in meinem Datensatz größer ist als ein Datums-/Zeitstempel von jetzt.
Ich verwende dieses Codefragment derzeit und es funktioniert wie ein Zauber.
LinqCampaigns.WhereParameters.Add("StopDate", System.Data.DbType.Date, DateTime.Now.ToString())
LinqCampaigns.Where = "GroupId = " & myGrp & " && " & "StopDate >= @StopDate"
Klappt wunderbar....
stellen Sie sicher, dass Sie den Nullwert wie folgt überprüfen:
'(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 hat nicht funktioniert, aber .Day hat für mich getan.
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();