这是我的代码,它应该为我的代码中的每一行计算,但它只为MU_w_o_No_Work
生成一行。
var query2 = from rg in db.MU_Reports.GroupBy(r => new { r.Date, r.Shift, r.Machine_Number })
join dt in db.Downtime_Reports
on new { rg.Key.Date, rg.Key.Shift, rg.Key.Machine_Number }
equals new { dt.Date, dt.Shift, dt.Machine_Number }
into dtGroup
select new
{
rg.Key.Date,
rg.Key.Shift,
rg.Key.Machine_Number,
MU = rg.Sum(r => r.MU),
NWTotal = dtGroup.Where(dt => dt.Downtime_Code == "9185").Sum(dt => dt.Total_DownTime)
};
query2.ToList();
foreach (var item2 in query2)
{
var y = new MU_By_Machine();
y.Date = item2.Date;
y.Shift = item2.Shift;
y.Machine_Number = item2.Machine_Number;
y.MU = item2.MU;
y.MU_w_o_No_Work = (item2.MU * 8) / (8 - item2.NWTotal);
db.MU_By_Machines.Add(y);
}
db.SaveChanges();
所以我不知道我到底做错了什么,但这是一个示例输出:
示例输入数据
Date | Machine Num. | Shift | MU | DT Hours
7/11/2016 | 1 | 1 | 70 | 2
7/11/2016 | 2 | 2 | 80 | 1
7/11/2016 | 1 | 2 | 60 | 4
7/12/2016 | 2 | 2 | 75 | 1
7/12/2016 | 1 | 2 | 75 | 0
示例输出数据
Date | Machine Num. | Shift | MU | MU w/o No work
7/11/2016 | 1 | 1 | 70 | 93.33
7/11/2016 | 2 | 2 | 80 | 91.43
7/11/2016 | 1 | 2 | 60 | 120
7/12/2016 | 2 | 2 | 75 | 85.7
7/12/2016 | 1 | 2 | 75 | 75
答案 0 :(得分:0)
关于错误:
不允许使用新事务,因为会话中还有其他线程在运行
因为您的连接正在foreach
迭代中主动阅读。您可以使用foreach
在.ToList()
语句之前或之内实现列表,然后在循环内使用SaveChanges
。
// this returns a list and does not convert the existing object to a list
// query2.ToList();
foreach (var item2 in query2.ToList()) // use ToList here
OR
// assign the results to a new object
var resultFromQuery2 = query2.ToList();
foreach (var item2 in resultFromQuery2)
但是,一条评论通常建议一次保存所有更改(在本例中为循环外),而不是在循环中。特别是在处理大量迭代时,这将为您节省大量开销并加快流程。或者,您可以使用某种类型的批处理计数器来使用%运算符(mod)保存每个XXX迭代。
免责声明:我没有查看您的其他代码,例如您的查询本身,只是您说的直接问题
答案 1 :(得分:0)
我理解我在foreach
语句中做错了什么我必须在if
为零时添加item2.NWTotal
语句,因为如果没有值,它就不能假设它为零那么我的foreach
语句应该是这样的:
foreach (var item2 in query2)
{
var y = new MU_By_Machine();
y.Date = item2.Date;
y.Shift = item2.Shift;
y.Machine_Number = item2.Machine_Number;
y.MU = item2.MU;
if (item2.NWTotal > 0)
y.MU_w_o_No_Work = (item2.MU * 8) / (8 - item2.NWTotal);
else
y.MU_w_o_No_Work = item2.MU;
db.MU_By_Machines.Add(y);
}
db.SaveChanges();