C # Linq, где дата между двумя датами

81

Я пытаюсь заставить свой оператор 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)
Дэвид
источник

Ответы:

148

Просто измените это на

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
Привет @Giorgi: указанный член типа Date не поддерживается в LINQ to Entities.
PeaceInMind
2
Привет @admin, решение для этого - не указывать функцию Date в свойствах таблицы. Например: db.Invoices.Where (w => w.Date> = Date1.Date && w.Date <= Date2.Date) .ToList (). Будет работать;)
JD - DC TECH
@ user1502624 Это не работает в основной линии EF, и я видел исходный код для этого. Я сделал ветку, которая действительно работает. Он работает путем преобразования .Dateзвонка в EntityFunctions.TruncateDateзвонок.
Aron
Этот запрос будет пропускать встречи, которые начинаются до даты начала и заканчиваются после даты окончания; многодневные встречи, которые должны быть включены. Если вам нужен запрос, который включает такие возможности, взгляните на «второй запрос» здесь stackoverflow.com/a/7815706/4040647 от @Enigmativity
Марк Сайзер
27
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
Андреас Нидермайр
источник
6
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();
GirishBabuC
источник
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;


        }

это мой запрос для записей поиска на основе данных поиска и между датой начала и окончания

Мухафил Сайед
источник
1

Если кому-то интересно узнать, как работать с 2-мя списками и между датами

var newList = firstList.Where(s => secondList.Any(secL => s.Start > secL.RangeFrom && s.End < secL.RangeTo))
Сумеш Сукумаран
источник
1

Если у вас есть условие фильтра интервала дат и вам нужно выбрать все записи, которые частично попадают в этот диапазон фильтра. Предположение: записи имеют свойство 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)
);
Томаш Описание
источник
0

Итак, вы прокручиваете вниз, потому что ответы не работают:

Это работает как по волшебству (но они говорят, что у этого есть проблемы с эффективностью для больших данных, и вам все равно, как и мне)

1- Тип данных в базе данных в моем случае - «datetime» и «допускающий значение NULL».

Пример формата данных в БД:

2018-11-06 15:33:43.640

В C # при преобразовании в строку выглядит так:

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

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))
    ....

благодаря

Адель Мурад
источник
По-прежнему не возвращаются нужные предметы в указанный диапазон дат.
Адам Ри
0

У меня возникла проблема с тем, чтобы это работало.

У меня было две даты в строке 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()
        };
KnuturO
источник