如何在日期范围内搜索多个实体?

时间:2019-06-20 08:32:21

标签: c# sql linq

我有下表:

  • 公司历史记录:Id StartDate EndDate
  • CustomerHistory (公司历史ID)
  • CustomerPayment ID客户ID StartDate结束日期金额

我要报告以搜索特定日期范围(firstDay,endDay)内的所有付款及其客户和公司。

我仅对CustomerPayment使用此代码,并且对CustomerHistory和companyHistory表也必须这样做。

而且性能真的很差。

有什么方法可以改善查询,还是应该更改数据库设计?

var payments= db.CustomerPayment.Where(s =>> 
             ((firstDay <= s.EndDate && lastDay >= s.StartDate) && 
              (lastDay <= s.EndDate || lastDay >= s.EndDate) && 
              (firstDay > s.StartDate || firstDay < s.StartDate)) ||
             ((s.EndDate == null) && ((firstDay >= s.StartDate) || 
              (firstDay <= s.StartDate && lastDay >= s.StartDate)));

1 个答案:

答案 0 :(得分:1)

  1. 您说您想每次付款(付款总是在一个确切的时间完成),所以我很困惑为什么要同时有结束日期和开始日期。如果可能的话,丢掉其中之一。
  2. 如果开始日期早于报告的最后一天 ,则付款在您的窗口内,并且结束日期超过了报告的开始日期。显然,endDate可以具有null表示无限,因此我在以下简洁明了的语句中添加了它:

var payments= db.CustomerPayment.Where(s =>> (s.StartDate <= lastDay && (a.EndDate >= firstDay || a.EndDate == null));

  1. 如果仍然缺少此查询的性能,则您在数据库中仅存在太多记录以提高性能。您可以按照@Uwe Keim的建议编写索引,或者每月(或每周或以最小的报告指标为准)计算一次每个客户的付款金额并将这些结果存储在数据库中。