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:
Ä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)
quelle
.Date
Anruf in einenEntityFunctions.TruncateDate
Anruf umgewandelt wird.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
quelle
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();
quelle
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
quelle
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))
quelle
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) );
quelle
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:
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:
Beachten Sie, dass die folgende Methode, die in anderen Fragen und Antworten zum Stapelüberlauf erwähnt wird, nicht ordnungsgemäß funktioniert:
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
quelle
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() };
quelle