我有以下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):
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
答案 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();