it-swarm.com.de

C # Linq Wo Datum zwischen 2 Datumsangaben

Ich versuche, meine linq-Anweisung zu erhalten, um alle Datensätze zwischen zwei Datumsangaben abzurufen, und ich bin 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)
62
David

Ä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)
125
Giorgi
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
22
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();
3
GirishBabuC

 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 für Suchdatensätze basierend auf Suchdaten und zwischen Start- und Enddatum

0
Muhafil Saiyed

Ich hatte ein Problem damit, das zum Laufen zu bringen.

Ich hatte zwei Daten in einer DB-Zeile und ich 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()
        };
0
KnuturO

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

Das funktioniert wie Magie (aber sie sagen, es habe Probleme mit der Effizienz von Big Data, und Sie interessieren sich nicht wie ich).

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

Beispieldatenformat in DB ist wie folgt:

2018-11-06 15:33:43.640

Ein in C #, wenn es in einen String umgewandelt wird, ist 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 zunächst Ihre datetime-Variablen im richtigen Format vorbereiten:

Beispiel 1

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

Beispiel 2 - Datetime-Bereich für die letzten 30 Tage

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

3- Zum Schluss die linq-Abfrage, die Sie bei der Suche 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 die folgende Methode, die bei anderen Stackoverflow-Fragen erwähnt wurde, und die Antworten werden nicht ordnungsgemäß funktionieren:

....
&&
(
    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 auf den nächsten Monat fällt, gibt die Abfrage den Wert false und keine Ergebnisse zurück. Beispiel:

DatabaseCreatedAtItemThatWeWant = 2018/12/05

startDate = 2018/12/01

EndDate = 2019/01/04

die Abfrage sucht immer nach Tagen zwischen 01 und 04, ohne den "Monat" zu berücksichtigen, so dass "s.Created_at.Value.Day <= DateEnd.Day" fehlschlägt 

Falls Sie wirklich große Daten haben, würden Sie statt Linq eine native SQL-Abfrage ausführen

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

Vielen Dank

0
Adel Mourad