wake-up-neo.com

Wie führe ich einen Datumsvergleich in EF aus?

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.

45
Kam

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.

18
jason

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

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

70
Mandeep Janjua

Möglicherweise ist das Datum in der Datenbank nullfähig. Versuche dies:

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

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.

8
Ejaz

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

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") ;
2
Yousuf Qureshi

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 ...

2
David Hedlund

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

1
Niraj

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....

1
Les

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();'
0
isambert

.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();
0
ADBatBWD