添加lambda表达式的where和sum

时间:2014-02-17 09:52:56

标签: linq lambda linq-to-entities

我有以下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表达式返回Output表的整个Quantity列的总和,因为我不确定如何添加'Where'子句以及总和函数(因此PercentOfTarget也不正确)。

where子句需要与第一个where子句相同(日期和行是传递给方法的参数):

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

有人可以帮忙吗?

编辑:澄清CurrentOutput。

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

编辑:进一步澄清

这是Output表中的一些示例数据(OutputID是自动增量PK):

enter image description here

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,每个日期将有多个记录,因为添加了更多的行号):

enter image description here

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

2 个答案:

答案 0 :(得分:2)

您可以为此目的尝试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语句中没有使用它的属性。

答案 1 :(得分:0)

正如@ 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();