Я пытаюсь заставить свой оператор linq получить все записи между двумя датами, и я не совсем уверен, что мне нужно изменить, чтобы заставить его работать: (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)
Ответы:
Просто измените это на
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)
источник
.Date
звонка вEntityFunctions.TruncateDate
звонок.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
источник
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();
источник
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; }
это мой запрос для записей поиска на основе данных поиска и между датой начала и окончания
источник
Если кому-то интересно узнать, как работать с 2-мя списками и между датами
var newList = firstList.Where(s => secondList.Any(secL => s.Start > secL.RangeFrom && s.End < secL.RangeTo))
источник
Если у вас есть условие фильтра интервала дат и вам нужно выбрать все записи, которые частично попадают в этот диапазон фильтра. Предположение: записи имеют свойство ValidFrom и 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) );
источник
Итак, вы прокручиваете вниз, потому что ответы не работают:
Это работает как по волшебству (но они говорят, что у этого есть проблемы с эффективностью для больших данных, и вам все равно, как и мне)
1- Тип данных в базе данных в моем случае - «datetime» и «допускающий значение NULL».
Пример формата данных в БД:
2018-11-06 15:33:43.640
В C # при преобразовании в строку выглядит так:
2019-01-03 4:45:16 PM
Итак, формат такой:
2- Итак, вам нужно сначала подготовить переменные даты и времени в правильном формате:
Пример 1
yourDate.ToString("yyyy/MM/dd hh:mm:ss tt")
Пример 2 - Диапазон дат за последние 30 дней
DateTime dateStart = DateTime.Now.AddDays(-30); DateTime dateEnd = DateTime.Now.AddDays(1).AddTicks(-1);
3- Наконец, запрос linq, который вы потеряли в течение дня, пытаясь найти (требуется EF 6)
using System.Data.Entity; _dbContext.Shipments.Where(s => (DbFunctions.TruncateTime(s.Created_at.Value) >= dateStart && DbFunctions.TruncateTime(s.Created_at.Value) <= dateEnd)).Count();
Чтобы также принять во внимание сравнение времени:
Обратите внимание, что следующий метод, упомянутый в других вопросах и ответах stackoverflow, не будет работать правильно:
если день начала приходился, например, на этот месяц, а день окончания - на следующий месяц, запрос вернет false и никаких результатов, например:
DatabaseCreatedAtItemThatWeWant = 2018/12/05
startDate = 2018/12/01
EndDate = 01.01.2019
запрос всегда будет искать дни между 01 и 04 без учета "месяца", поэтому "s.Created_at.Value.Day <= dateEnd.Day" завершится ошибкой
И если у вас действительно большие данные, вы должны выполнить собственный SQL-запрос, а не linq
... ... where Shipments.Created_at BETWEEN CAST(@Created_at_from as datetime) AND CAST(@Created_at_to as datetime)) ....
благодаря
источник
У меня возникла проблема с тем, чтобы это работало.
У меня было две даты в строке db, и мне нужно добавить их в список вчера, сегодня и завтра.
это мое решение:
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() };
источник