我有这个模型:
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年。但于2018年12月12日重新生成(Id 2)
答案 0 :(得分:0)
很难确切地了解您要在此处执行的操作,但是我了解的是,为了验证此模型,Date
属性必须位于model.Start
之前,而{{1 }}属性必须介于NextDate
和model.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
属性是否都在NextDate
和model.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;