C # Linq Wobei Datum zwischen 2 Daten


79

Ich versuche, mit meiner linq-Anweisung alle Datensätze zwischen zwei Daten abzurufen, und ich bin mir nicht ganz sicher, was ich ändern muss, damit es funktioniert: (a.Start >= startDate && endDate)

var appointmentNoShow =
    from a in appointments
    from p in properties
    from c in clients
    where a.Id == p.OID && (a.Start.Date >= startDate.Date && endDate)

Antworten:


146

Ändern Sie es einfach in

var appointmentNoShow = from a in appointments
                        from p in properties
                        from c in clients
                        where a.Id == p.OID && 
                       (a.Start.Date >= startDate.Date && a.Start.Date <= endDate)

4
Hi @Giorgi: Das angegebene Typmitglied 'Date' wird in LINQ to Entities nicht unterstützt.
PeaceInMind

2
Hallo @admin, die Lösung hierfür ist, die Funktion Datum nicht in den Eigenschaften der Tabelle anzugeben. Zum Beispiel: db.Invoices.Where (w => w.Date> = Date1.Date && w.Date <= Date2.Date) .ToList (). Es wird funktionieren;)
JD - DC TECH

@ user1502624 Das funktioniert nicht in EF Mainline und ich habe den Quellcode dafür gesehen. Ich habe einen Zweig gemacht, der funktioniert. Es funktioniert, indem der .DateAnruf in einen EntityFunctions.TruncateDateAnruf umgewandelt wird.
Aron

Bei dieser Abfrage werden Termine weggelassen, die vor dem Startdatum beginnen und nach dem Enddatum enden. mehrtägige Termine, die enthalten sein sollten. Wenn Sie eine Abfrage benötigen, die solche Möglichkeiten enthält, werfen Sie einen Blick auf die "zweite Abfrage" hier stackoverflow.com/a/7815706/4040647 von @Enigmativity
Mark Sizer

26
var appointmentNoShow = from a in appointments
                        from p in properties
                        from c in clients
                        where a.Id == p.OID
                        where a.Start.Date >= startDate.Date
                        where a.Start.Date <= endDate.Date

4
var QueryNew = _context.Appointments.Include(x => x.Employee).Include(x => x.city).Where(x => x.CreatedOn >= FromDate).Where(x => x.CreatedOn <= ToDate).Where(x => x.IsActive == true).ToList();

1

 public List<tbltask> gettaskssdata(int? c, int? userid, string a, string StartDate, string EndDate, int? ProjectID, int? statusid)
        {
            List<tbltask> tbtask = new List<tbltask>();
            DateTime sdate = (StartDate != "") ? Convert.ToDateTime(StartDate).Date : new DateTime();
            DateTime edate = (EndDate != "") ? Convert.ToDateTime(EndDate).Date : new DateTime();
            tbtask = entity.tbltasks.Include(x => x.tblproject).Include(x => x.tbUser).
                Where(x => x.tblproject.company_id == c
                    && (ProjectID == 0 || ProjectID == x.tblproject.ProjectId)
                    && (statusid == 0 || statusid == x.tblstatu.StatusId)
                    && (a == "" || (x.TaskName.Contains(a) || x.tbUser.User_name.Contains(a)))
                    && ((StartDate == "" && EndDate == "") || ((x.StartDate >= sdate && x.EndDate <= edate)))).ToList();



            return tbtask;


        }

Dies ist meine Abfrage nach Suchdatensätzen basierend auf Suchdaten und zwischen Start- und Enddatum


1

Wenn jemand interessiert ist, wie man mit 2 Listen und zwischen Daten arbeitet

var newList = firstList.Where(s => secondList.Any(secL => s.Start > secL.RangeFrom && s.End < secL.RangeTo))

1

Wenn Sie eine Filterbedingung für das Datumsintervall haben und alle Datensätze auswählen müssen, die teilweise in diesen Filterbereich fallen. Annahme: Datensätze haben die Eigenschaften ValidFrom und ValidTo.

DateTime intervalDateFrom = new DateTime(1990, 01, 01);
DateTime intervalDateTo = new DateTime(2000, 01, 01);

var itemsFiltered = allItems.Where(x=> 
    (x.ValidFrom >= intervalDateFrom && x.ValidFrom <= intervalDateTo) ||
    (x.ValidTo >= intervalDateFrom && x.ValidTo <= intervalDateTo) ||
    (intervalDateFrom >= x.ValidFrom && intervalDateFrom <= x.ValidTo) ||
    (intervalDateTo >= x.ValidFrom && intervalDateTo <= x.ValidTo)
);

0

Sie scrollen also nach unten, weil die Antworten nicht funktionieren:

Das funktioniert wie Magie (aber sie sagen, es hat Effizienzprobleme für Big Data, und es ist dir egal wie mir)

1- Der Datentyp in der Datenbank ist in meinem Fall "datetime" und "nullable".

Das Beispieldatenformat in der Datenbank lautet wie folgt:

2018-11-06 15:33:43.640

Ein in C # konvertiertes Zeichen lautet wie folgt:

2019-01-03 4:45:16 PM

Das Format ist also:

yyyy/MM/dd hh:mm:ss tt

2- Sie müssen also zuerst Ihre datetime-Variablen im richtigen Format vorbereiten:

Beispiel 1

yourDate.ToString("yyyy/MM/dd hh:mm:ss tt")

Beispiel 2 - Datenzeitbereich für die letzten 30 Tage

    DateTime dateStart = DateTime.Now.AddDays(-30);
    DateTime dateEnd = DateTime.Now.AddDays(1).AddTicks(-1);

3- Schließlich die Linq-Abfrage, die Sie am Tag des Suchens verloren haben (EF 6 erforderlich).

using System.Data.Entity;

_dbContext.Shipments.Where(s => (DbFunctions.TruncateTime(s.Created_at.Value) >= dateStart && DbFunctions.TruncateTime(s.Created_at.Value) <= dateEnd)).Count();

Um auch den Zeitvergleich zu berücksichtigen:

(DbFunctions.CreateDateTime(s.Created_at.Value.Year, s.Created_at.Value.Month, s.Created_at.Value.Day, s.Created_at.Value.Hour, s.Created_at.Value.Minute, s.Created_at.Value.Second) >= dateStart && DbFunctions.CreateDateTime(s.Created_at.Value.Year, s.Created_at.Value.Month, s.Created_at.Value.Day, s.Created_at.Value.Hour, s.Created_at.Value.Minute, s.Created_at.Value.Second) <= dateEnd)

Beachten Sie, dass die folgende Methode, die in anderen Fragen und Antworten zum Stapelüberlauf erwähnt wird, nicht ordnungsgemäß funktioniert:

....
&&
(
    s.Created_at.Value.Day >= dateStart.Day && s.Created_at.Value.Day <= dateEnd.Day &&
    s.Created_at.Value.Month >= dateStart.Month && s.Created_at.Value.Month <= dateEnd.Month &&
    s.Created_at.Value.Year >= dateStart.Year && s.Created_at.Value.Year <= dateEnd.Year
)).count();

Wenn der Starttag beispielsweise in diesem Monat war und der Endtag im nächsten Monat liegt, gibt die Abfrage false und keine Ergebnisse zurück, zum Beispiel:

DatabaseCreatedAtItemThatWeWant = 2018/12/05

startDate = 2018/12/01

EndDate = 04.01.2019

Die Abfrage sucht immer nach Tagen zwischen 01 und 04, ohne den "Monat" zu berücksichtigen. Daher schlägt "s.Created_at.Value.Day <= dateEnd.Day" fehl

Und falls Sie wirklich große Datenmengen haben, würden Sie Native SQL Query anstelle von Linq ausführen

...
    ... where Shipments.Created_at BETWEEN CAST(@Created_at_from as datetime) AND CAST(@Created_at_to as datetime))
    ....

Vielen Dank


Immer noch nicht die richtigen Artikel im Datumsbereich zurückbekommen.
Adam Ri

0

Ich hatte ein Problem damit.

Ich hatte zwei Daten in einer Datenbankzeile und muss sie einer Liste für gestern, heute und morgen hinzufügen.

Das ist meine Lösung:

        var yesterday = DateTime.Today.AddDays(-1);
        var today = DateTime.Today;
        var tomorrow = DateTime.Today.AddDays(1);            
        var vm = new Model()
        {
            Yesterday = _context.Table.Where(x => x.From <= yesterday && x.To >= yesterday).ToList(),
            Today = _context.Table.Where(x => x.From <= today & x.To >= today).ToList(),
            Tomorrow = _context.Table.Where(x => x.From <= tomorrow & x.To >= tomorrow).ToList()
        };
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.