Начальный и конечный период должен содержать дату и не содержать другую дату - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть эта модель:

public class Documento
{
   public int Id {get;set;}
   public int CustomerId {get;set;}
   public int DocumentTypeId {get;set;}
   public DateTime Date {get;set;} //issuance of the document
   public DateTime NextDate {get;set;} //will be valid
}

Свойство Date означает дату создания документа, а свойство NextDate - это дату, когда документ должен быть восстановлен

Образец данных

Id  -  CustomerId  -  DocumentTypeId           Date       -      NextDate
1   -  1           -     1              -  12/12/2017     -     12/12/2018 - Generate in 2017, expiring in 2018
2   -  1           -     1              -  12/12/2018     -     12/12/2019 - Generate in 2018, this ok
3   -  1           -     1              -  10/01/2017     -     10/01/2018

Мне нужно найти документы, которые не были созданы в 2018

Моя начальная дата 01/01/2018 и окончательная 01/01/2019

Я пыталсяэто:

db.Documents.AsNoTracking().AsQueryable()
                       .Where(x =>
                            DbFunctions.TruncateTime(x.Date) >= model.Start &&
                            DbFunctions.TruncateTime(x.Date) <= model.End &&
                            DbFunctions.TruncateTime(x.NextDate) >= model.Start &&
                            DbFunctions.TruncateTime(x.NextDate) <= model.End).ToList();

[Редактировать]

Когда пройдена начальная и конечная дата 01/01/2018 и 01/01/2019, возвращаемое значение равно:

Id  -  CustomerId  -  DocumentTypeId           Date       -      NextDate
3   -  1           -     1              -  10/01/2017     -     10/01/2018

Документ с(Id 1) был сгенерирован в 2017 году и действителен до 2018 года. Но в 12.12.2008 был регенерирован (Id 2)

Ответы [ 2 ]

0 голосов
/ 17 декабря 2018

Если вам нужны только те документы, срок действия которых истек в 2018 году, то я предполагаю, что вам нужно только посмотреть даты окончания.

В этом запросе будут найдены документы с NextDate, которые попадают в область поиска.Примечание: я использовал let, чтобы избежать избыточных вызовов на DbFunctions.TruncateTime.

var expiredDocuments = from document in db.Documents.AsNoTracking().AsQueryable()
                       let endDate = DbFunctions.TruncateTime(document.NextDate)
                       where endDate >= model.Start && endDate <= model.End
                       select document;
0 голосов
/ 17 декабря 2018

Трудно понять, что именно вы хотите сделать здесь, но я понял, что для проверки этой модели свойство Date должно быть до model.Start, а свойство NextDate должно бытьот model.Start до model.End

Для этого вам нужно изменить свой запрос LINQ:

db.Documents.AsNoTracking().AsQueryable()
                       .Where(x => x.Type == model.Type &&
                            DbFunctions.TruncateTime(x.Date) < model.Start &&
                            DbFunctions.TruncateTime(x.NextDate) >= model.Start &&
                            DbFunctions.TruncateTime(x.NextDate) <= model.End).ToList();

В текущем запросе LINQ проверяется, что Date иNextDate свойства попадают между model.Start и model.End

Я бы также предложил изменить имена свойств с «Date» и «NextDate» на что-то более значимое.Имена свойств должны быть самоочевидными, когда это возможно.

...