【问题标题】:Adding where and sum to lambda expression将 where 和 sum 添加到 lambda 表达式
【发布时间】:2014-02-17 09:52:55
【问题描述】:

我有以下 Linq 查询:

var qry = from Output in db.Outputs
          join ShiftHours in db.ShiftHourses on Output.ShiftHour equals ShiftHours.ShiftHour
          join ShiftData in db.ShiftDatas on Output.ShiftID equals ShiftData.ShiftID
          where ShiftData.ShiftDate == date && ShiftData.Line == line
          select new ProgressData()
          {
              CPM = ShiftData.CPM,
              Target = ShiftData.Target,
              CurrentOutput = db.Outputs.Sum(x=>x.Quantity),
              PercentOfTarget = (db.Outputs.Sum(x=>x.Quantity) / ShiftData.Target) * 100
          };

它几乎是在做我想做的事,但就目前而言,CurrentOutput lambda 表达式正在返回输出表的整个 Quantity 列的总和,因为我不确定如何添加“Where”子句以及总和函数(因此 PercentOfTarget 也不正确)。

where子句需要和第一个where子句一样(date和line是传递给方法的参数):

where ShiftData.ShiftDate == date && ShiftData.Line == line

谁能帮忙?

编辑:CurrentOutput 的说明。

在“输出”表中,给定的“ShiftData.ShiftDate”和“ShiftData.Line”组合可以有多个记录,所以我想计算一个“输出”表“数量”列值的总和指定 'ShiftDate' 和 'Line'

编辑:进一步澄清

这是来自输出表的一些示例数据(OutputID 是一个自增的 PK):

public class Output
{
    [Key]
    public int OutputId { get; set; }
    public int ShiftID { get; set; }
    public int Quantity { get; set; }
    public int ShiftHour { get; set; }

    public virtual ShiftData ShiftData { get; set; }
}

这是 ShiftData 表中的一些示例数据(ShiftID 是一个自动递增的 PK,随着更多行号的添加,每个日期将有多个记录):

public class ShiftData
{
    [Key]
    public int ShiftID { get; set; }
    public DateTime ShiftDate { get; set; }
    public string Line { get; set; }
    public int CPM { get; set; }
    public double Target { get; set; }
}

所以使用上面的示例数据,我正在尝试填充 ProgressData 对象:

public class ProgressData
{
    public int CPM { get; set; }
    public double Target { get; set; }
    public int CurrentOutput { get; set; }
    public double PercentOfTarget { get; set; }
}

根据示例数据,我希望我在 2014 年 2 月 13 日为第 1 行创建的 ProgressData 对象将按如下方式填充:

CPM = 5,目标 = 200,CurrentOutput = 120,PercentOfTarget = 60

【问题讨论】:

  • 你能指定你想计算的电流输出吗?为什么必须是 SUM?
  • 抱歉,我在最初的问题中没有说清楚。我已经更新了这个问题。希望现在这更有意义
  • 因此,如果您有多个 Output 对象具有相同的班次日期和行,那么您希望这些对象中的 每个 具有所有具有相同班次的对象数量的总和日期和线路?
  • 听起来你的查询中应该有一个group ... into 表达式。现在它对我来说没有意义。
  • 对不起,没有。此查询的目标是创建一个新的 ProgressData 对象。此 ProgressData 对象包含 CurrentOutput。我想用给定班次日期和行的所有输出对象数量的总和填充 CurrentOutput。如果这有助于澄清,我可以发布对象和表格数据?

标签: linq lambda linq-to-entities


【解决方案1】:

您可以为此尝试做group join

var qry = from ShiftData in db.ShiftDatas
          join Output in db.Outputs on ShiftData.ShiftID equals Output.ShiftID
          into ShiftGroup 
          where ShiftData.ShiftDate == date && ShiftData.Line == line
          select new ProgressData()
          {
              CPM = ShiftData.CPM,
              Target = ShiftData.Target,
              CurrentOutput = ShiftGroup.Sum(x=>x.Quantity),
              PercentOfTarget = (ShiftGroup.Sum(x=>x.Quantity) / ShiftData.Target) * 100
          };

另一件事,我不明白为什么你需要在这里加入 ShiftHours,因为它在 select 语句中没有使用的属性。

【讨论】:

  • 感谢您的回答,我同意,我不再需要 ShiftHours 加入。我将其用作参考,但现在可以将其删除。正如你发布的那样,我设法让它自己工作(我将在下面发布我的答案)但我现在要试试你的答案,因为它似乎比我的更整洁
  • 对第一个 join 语句进行了轻微修改,因为它没有按原样编译。现在工作正常并将标记为答案,因为它比我的答案更好。谢谢
  • @Jimsan - 我认为您可能需要group ... into,但join ... into 也一样好。
【解决方案2】:

正如@har07 发布的那样,我设法使用下面的方法让它工作。我将其发布以供参考,因为它确实回答了原始问题,但我将尝试使用 @har07 的代码,因为它比我的更整洁。

var qry = (from Output in db.Outputs
                       join ShiftHours in db.ShiftHourses on Output.ShiftHour equals ShiftHours.ShiftHour
                       join ShiftData in db.ShiftDatas on Output.ShiftID equals ShiftData.ShiftID
                       where ShiftData.ShiftDate == date && ShiftData.Line == line
                       select new
                       {
                           ShiftData.ShiftDate,
                           ShiftData.Line,
                           ShiftData.CPM,
                           ShiftData.Target,
                           Output.Quantity
                       }).ToList();

            var progress = qry.GroupBy(l => l.ShiftDate).Select(g => new ProgressData()
            {
                CPM = g.Where(c => c.ShiftDate == date && c.Line == line).Select(c => c.CPM).FirstOrDefault(),
                Target = g.Where(c => c.ShiftDate == date && c.Line == line).Select(c => c.Target).FirstOrDefault(),
                CurrentOutput = g.Where(c => c.ShiftDate == date && c.Line == line).Sum(c => c.Quantity),
                PercentOfTarget = g.Where(c => c.ShiftDate == date && c.Line == line).Sum(c => (c.Quantity / c.Target) * 100)
            });

            return progress.FirstOrDefault();

【讨论】:

    猜你喜欢
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-05
    相关资源
    最近更新 更多