为了账号安全,请及时绑定邮箱和手机立即绑定

Linq to SQL C#:日期之间的项目

Linq to SQL C#:日期之间的项目

C#
千巷猫影 2021-10-09 16:58:18
我的 SQL Server 2012 中有 2 个表:Errors (id, cityID, centerID, date)InspectionVisits (id, cityID, centerID, datePerformed)我正在尝试获得errors之间的数量,inspection visits以查看中心是否有特定的改进centerID并构建图表。到目前为止,这是我的代码,但我不知道如何编写 where 子句来获取这些检查访问之间的错误数:var errorsPerIV = from e in dc.Errors                  where e.cityID == ctid && e.centerID == centerid                   group e by e.date.Date into g                  join iv in dc.InspectionVisits on g.FirstOrDefault().cityID equals iv.cityID                  where iv.centerID == g.FirstOrDefault().centerID                  select new                  {                      Day = g.Key.Day + "/" +                            g.Key.Month + "/" +                            g.Key.Year,                      Errors = g.Count()                  };示例案例 类似于:Inspection_Visit_1 和Inspection_Visit_2 之间有5 个错误,Inspection_Visit_2 和Inspection_Visit_3 之间有2 个错误,以及Inspection_Visit_3 和今天之间有1 个错误。编辑如果我每天显示查询并仅在图表的 x 轴上标记检查访问,它可能会起作用。
查看完整描述

2 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

我不确定是否有更好的方法,但您可以执行以下操作


假设你有一个类


public class Summary

{

    public DateTime? PreviousInspection;

    public DateTime? NextInspection;

    public int Errors;

}

然后你可以通过查询来获得大部分信息


var errorsPerIV = (from e in dc.Errors

                      where e.cityID == ctid && e.centreID == centreid


                      // Find the date of the previous inspection (if any)

                      let previousInspection = (from i in dc.InspectionVisits where i.cityID == e.cityID && i.centreID == e.centreID && i.datePerformed <= e.date orderby i.datePerformed descending select i.datePerformed).FirstOrDefault()


                       // Find the date of the next inspection (if any)

                      let nextInspection     = (from i in dc.InspectionVisits where i.cityID == e.cityID && i.centreID == e.centreID && i.datePerformed >  e.date orderby i.datePerformed ascending  select i.datePerformed).FirstOrDefault()


                      group e by new { previousInspection , nextInspection } into results


                      orderby results.Key.previousInspection 

                      select new Summary

                      {

                          PreviousInspection = results.Key.previousInspection,

                          NextInspection     = results.Key.nextInspection ,

                          Errors             = results.Count()

                      })

                      .ToList();

但是,如果两次访问之间没有错误,那么这些访问将不会出现在您的列表中,因此您需要查找所有访问并查看是否有缺失,即类似


var inspectionsDates = (from i in InspectionVisits where i.cityID == ctid && i.centreID == centreid orderby i.datePerformed select i.datePerformed).ToList();


    for(int i=0; i< inspectionsDates.Count-1; i++)

    {

        if (!errorsPerIV.Any(a=>a.PreviousInspection == inspectionsDates[i]))

        {

            errorsPerIV.Add(new Summary() { PreviousInspection = inspectionsDates[i], NextInspection = inspectionsDates[i + 1], Errors = 0});

        }

    }


查看完整回答
反对 回复 2021-10-09
  • 2 回答
  • 0 关注
  • 214 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信