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

C# 如何在日期范围内搜索多个实体?,c#,sql,linq,C#,Sql,Linq,我有以下表格: 公司历史记录:Id开始日期结束日期 客户历史记录Id公司Id开始日期结束日期 客户付款Id客户Id开始日期结束日期金额 我想为制作一份报告,以搜索特定日期范围内(第一天、结束天)的所有付款及其客户和公司 我只为CustomerPayment使用此代码,并且我必须为CustomerHistory和companyHistory表执行相同的操作 而且表现真的很差 有没有办法改进查询,或者我应该改变我的数据库设计 var payments= db.CustomerPayment.Wh

我有以下表格:

  • 公司历史记录:Id开始日期结束日期
  • 客户历史记录Id公司Id开始日期结束日期
  • 客户付款Id客户Id开始日期结束日期金额
我想为制作一份报告,以搜索特定日期范围内(第一天、结束天)的所有付款及其客户和公司

我只为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)));
var payments=db.CustomerPayment.Where(s=>>
((第一天=s.StartDate)和
(lastDay=s.EndDate)和
(第一天>s.StartDate | |第一天=s.StartDate)||
(第一天=开始日期);
  • 你说你想要每一笔付款(付款总是在一个准确的时刻完成),所以我不明白为什么会有一个结束日期和一个开始日期。如果可能的话,失去其中一个
  • 如果开始日期早于您报告的最后一天,并且您的结束日期超过了您报告的开始日期,那么付款就在您的窗口内。显然,endDate可以为空,表示无限,因此我在以下简洁的陈述中补充了这一点:
  • var payments=db.CustomerPayment.Where(s=>>
    (s.StartDate=firstDay | | a.EndDate==null));

  • 如果此查询的性能仍然不足,那么您的数据库中的记录就太多了。您可以按照@Uwe Keim的建议编写索引,或者每月(或每周或任何最小的报告指标)计算一次每位客户的付款金额,并将这些结果存储在您的数据库中
  • 用于获取该查询的SQL,然后在该SQL上使用以查看缺少哪些索引。