C # Linq Де дата між 2 датами


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: Зазначений член типу "Дата" не підтримується в 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дзвінок.
Арон,

Цей запит не включатиме зустрічей, які починаються до дати початку та закінчуються після дати закінчення; багатоденні зустрічі, які слід включити. Якщо вам потрібен запит , який включає в себе такі можливості , то подивіться на «другий запит» тут stackoverflow.com/a/7815706/4040647 по @Enigmativity
Марк Sizer


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();

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- Тип даних у базі даних - це "дата-час" і "нульовий" у моєму випадку.

Приклад формату даних у БД такий:

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();

якщо початковий день був, наприклад, у цьому місяці, а кінцевий - у наступному, запит поверне помилковий результат і результатів не буде, наприклад:

DatabaseCreatedAtItemThatWeWant = 2018/12/05

дата початку = 01.12.2018

Кінцева дата = 04.04.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()
        };
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.