【问题标题】:Iterate through Linq to Entities results until condition is met遍历 Linq to Entities 结果,直到满足条件
【发布时间】:2018-11-10 03:43:41
【问题描述】:

这是场景,我有一个查询,它返回一个 dat 中的事件。从轮班开始(SS)开始,如果找到,我需要找到一个轮班结束(SE),然后继续下一个,如果没有,则生成错误并记录它发生的行。

List<string> errorList = new List<string>();
List<int> errorListRow = new List<int>();
var itCompareDay = (from h in db.DailyGPSTables
                    where h.EmplID == EmpID
                       && (h.EventDateTime >= startDate
                       && h.EventDateTime <= endDate)
                       && (h.EventType == "SS" || h.EventType == "JS" || h.EventType == "LS" || h.EventType == "LE" || h.EventType == "JE" || h.EventType == "SE")
                    orderby h.EventDateTime
                    select h).ToList();
int rowNumber = -1;
foreach (DailyGPSTable e in itCompareDay)
{
   rowNumber = rowNumber + 1;
   string EOOmessage="";
   string eventText="";
   int dayCountSs = itCompareDay.Count(k => k.EventType == "SS" && (k.EventDateTime.Value.ToShortDateString() == e.EventDateTime.Value.ToShortDateString()));
   int dayCountSe = itCompareDay.Count(k => k.EventType == "SE" && (k.EventDateTime.Value.ToShortDateString() == e.EventDateTime.Value.ToShortDateString()));
   int dayCountJS = itCompareDay.Count(k => k.EventType == "JS" && (k.EventDateTime.Value.ToShortDateString() == e.EventDateTime.Value.ToShortDateString()));
   // Response.Write("<br> Count of event type is ss on " + e.EventDateTime.Value.ToShortDateString() + " is  " + itCompareDay.Count(k => k.EventType == "SS" && k.EventDateTime.Value.ToShortDateString() == e.EventDateTime.Value.ToShortDateString()));
   if (dayCountSs != dayCountSe)
   {
      eventText = "";
      if (dayCountSs > dayCountSe)
      {
         eventText = "Shift End (SE)";
      }
      else
      {
         eventText = "Shift Start (SS)";
      }
      EOOmessage = " On " + e.EventDateTime.Value.ToShortDateString() + " there is a missing " + eventText;
      errorList.Add(EOOmessage);
      errorListRow.Add(rowNumber);   
  }

上面的代码一整天都返回一个错误,我沿着这条路走,找到轮班开始没有结束标记的行并突出显示该行。一天可以有多个班次,但必须有一个结束标签。

if (dayCountSs != dayCountSe)
{
   eventText = "";
   if (dayCountSs > dayCountSe)
   {
      string dayEvents = e.EventType;
      Response.Write("SS greater than SE >Event Type " + dayEvents +"<BR>");
      for (int i = 0; i < dayCountSs; i++)
      {
         Response.Write("Should see a count here " + i);
         if (dayEvents[i].ToString() != "SS")
         {
            i = i + 1;
         }
         else
         {
            errorListRow.Add(rowNumber);
            eventText = "Shift End (SE)";
         }
      }
   }
   else
   {
      eventText = "Shift Start (SS)";
   }
   EOOmessage = " On " + e.EventDateTime.Value.ToShortDateString() + " there is a missing " + eventText;

【问题讨论】:

  • 您能否提供一个发生错误的简单数据示例?您的代码可读性......缺乏,这阻碍了我对您期望的逻辑连续操作的理解。 MCVE 在这里会很有帮助。
  • @Hogan 我的问题是如何遍历日子事件以找到未配对的 SE 标签。例如,在 2018 年 11 月 8 日,我有 3 个班次,那天我有 3 个 SS 标签实例,但只有 2 个 SE 标签,这意味着第 3 个班次开始但从未结束。如何找到第 3 个 SS 标签以将错误条件添加到我的列表并记录行号?
  • 这就是您要解决的问题。我们不只是为这里的人们写解决方案——我们帮助解决问题。在尝试解决该问题时,您是否遇到了无法按预期工作的问题。例如,是否有一个测试用例失败。我们可以回答一个问题——只要不是问题——我该如何解决这个问题,为我编写所有代码。您给了我们一些代码,但没有详细说明您遇到的问题。如果我必须花 3 个小时来理解回答您问题的解决方案,我不会这样做。如果需要 10 分钟,我很乐意提供帮助。
  • 您可以在帮助屏幕中找到很多关于如何提出好问题的好资源。在这种情况下,我建议向我们提供输入数据和预期的输出数据和您当前的代码在做什么。如果你这样做,我希望有人会很快回答。 (甚至可能是我)

标签: c# asp.net linq


【解决方案1】:

使用与other question 相同的扩展方法,相同的代码应该可以工作,只是用于 SS/SE 而不是 JS/JE:

var shiftErrEvents = itCompareDay
                        .Select((ev, rowNum) => new { ev.EventType, ev.EventDateTime, rowNum })
                        .Where(cd => cd.EventType == "SS" || cd.EventType == "SE")
                        .GroupByWhile((pd, cd) => pd.EventType == "SS" && cd.EventType == "SE" && pd.EventDateTime.Date == cd.EventDateTime.Date)
                        .Where(cdg => cdg.Count() != 2)
                        .SelectMany(cdg => cdg.Select(cd => new { cd.rowNum, ErrMsg = cd.EventType == "SE" ? "SE without preceding SS" : "SS without following SE" }));

注意:在这两种情况下,跨越午夜边界的工作或轮班(因此,在不同的日子)将被视为两个不匹配的事件。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-01
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多