初始和最后期限必须包含一个日期,而不能包含其他日期

时间:2018-12-17 18:39:43

标签: c# entity-framework entity-framework-6

我有这个模型:

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/201801/01/2019的返回提示是:

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

带有(Id 1)的文档于2017年生成,有效期至2018年。但于2018年12月12日重新生成(Id 2)

2 个答案:

答案 0 :(得分:0)

很难确切地了解您要在此处执行的操作,但是我了解的是,为了验证此模型,Date属性必须位于model.Start之前,而{{1 }}属性必须介于NextDatemodel.Start

之间

要实现此目的,您需要更改LINQ查询:

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(); Date属性是否都在NextDatemodel.Start之间

我还建议将属性名称从“ Date”和“ NextDate”更改为更有意义的名称。属性名称应尽可能不言自明。

答案 1 :(得分:0)

如果您只希望文档在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;