只显示一行

时间:2016-07-15 17:11:18

标签: c# entity-framework

这是我的代码,它应该为我的代码中的每一行计算,但它只为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

2 个答案:

答案 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();