С# Linq Где дата между 2 датами
Я пытаюсь получить свой оператор 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)
Ответы
Ответ 1
Просто измените его на
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)
Ответ 2
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
Ответ 3
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();
Ответ 4
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;
}
Ответ 5
Таким образом, вы прокручиваете вниз, потому что ответы не работают:
Это работает как по волшебству (но они говорят, что это имеет проблемы с эффективностью для больших данных, и вам все равно, как и мне)
1- Тип данных в базе данных "datetime" и "nullable" в моем случае.
Пример формата данных в БД выглядит так:
2018-11-06 15:33:43.640
В С# при преобразовании в строку выглядит так:
2019-01-03 4:45:16 PM
Итак, формат такой:
yyyy/MM/dd hh:mm:ss tt
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();
Чтобы принять во внимание также сравнение времени:
(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)
Обратите внимание, что следующий метод, упомянутый в других вопросах и ответах stackoverflow, не будет работать правильно:
....
&&
(
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();
например, если начальный день был в этом месяце, а конечный день - в следующем месяце, запрос вернет false и результатов не будет, например:
DatabaseCreatedAtItemThatWeWant = 2018/12/05
startDate = 2018/12/01
Конечная дата = 2019/01/04
запрос всегда будет искать дни между 01 и 04 без учета "месяца", поэтому "s.Created_at.Value.Day <= dateEnd.Day" завершится ошибкой
И если у вас действительно большие данные, вы выполняете Native SQL Query, а не linq.
...
... where Shipments.Created_at BETWEEN CAST(@Created_at_from as datetime) AND CAST(@Created_at_to as datetime))
....
Спасибо
Ответ 6
У меня была проблема с тем, чтобы заставить это работать.
У меня было две даты в строке БД, и мне нужно добавить их в список на вчера, сегодня и завтра.
это мое решение:
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()
};