【问题标题】:Prevent duplicate sum in linq group and join防止 linq 组中的重复总和并加入
【发布时间】:2015-10-19 09:25:02
【问题描述】:

我有两个带有 linq 连接查询的表:

例如:

MandaysReal
date       | mandays
----------------------
2015/10/15 | 5
2015/10/15 | 7

EstateAttendance
date       | mandays
----------------------
2015/10/15 | 2

然后我加入这个查询并按日期分组:

var data = from m in db.ManDaysReals

       join a in db.EstateAttendances on m.Date equals a.Date
       group new { M = m, A = a } by m.Date into g
       where g.FirstOrDefault().A.Date >= startDate && g.FirstOrDefault().A.Date <= endDate
       && g.FirstOrDefault().A.Block.Section.Id == SectionId

       select new CompareMandaysViewModel
       {
          Date = g.FirstOrDefault().A.Date,
          HKMandays = g.Sum(x => x.M.Mandays),
          HKAttendance = g.Sum(x => (decimal)x.A.mandays),
       };

结果如下所示:

CompareMandaysViewModel
date       | HKMandays | HKAttendance
2015/10/15 |    12     |      4 <-- why the result is 4 ?

HKAttendance 的值是重复的,谁能帮帮我?

谢谢你

【问题讨论】:

  • HKAttendance 而不是 4 的正确值应该是多少? (是2吗?这个计算的逻辑是什么)
  • 该值应为 2,因为 EstateAttendance 中只有一个数据
  • 当您在 LINQ 中使用“join”关键字时,您有笛卡尔积。这意味着联接为您提供了 2 条记录,Mandays=2 导致 SUm 为 4。
  • 我同意@TechieBee。如果您对长 LINQ 请求有任何问题,可以将其拆分为多个请求并检查中间结果
  • 那我该怎么办?有没有过滤器来检查它是否有超过 1 条记录?

标签: c# linq


【解决方案1】:

步骤:
1.将每张表中的记录分别分组到列表中
2. 稍后加入他们
见下例

        var xp = (from p in db.ManDaysReals
                  group p by p.Date into g
                  select new
                  {
                      Date = g.Key,
                      ManDays = g.Sum(p => p.ManDays)
                  }).ToList();

        var xa = (from p in db.EstateAttendances
                  group p by p.Date into g
                  select new
                  {
                      Date = g.Key,
                      ManDays = g.Sum(p => p.ManDays)
                  }).ToList();

        var xt =  from p in xp
                  join a in xa on p.Date equals a.Date
                  select new CompareMandaysViewModel
                  {
                      Date = p.Date,
                      HKMandays = p.ManDays,
                      HKAttendance = a.ManDays
                  };

【讨论】:

    猜你喜欢
    • 2012-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 2015-08-07
    • 2020-12-09
    • 2020-12-06
    相关资源
    最近更新 更多