2016-07-15 10 views
0

ここに私のコードは、私のコード内の各行を計算するはずですが、それはMU_w_o_No_Workのための1つの行を生成しています。1行だけを表示

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

を言っています'query2'の結果ごとに1つの広告? – juharr

+0

'' MU_w_o_No_Work'のために1行だけを生成するのはどういう意味ですか?ここで何を期待していますか?これは単なる数値なので、1つの値(複雑なオブジェクトではない)が存在するようです。 – Igor

+0

それは私のデータテーブルの複数の行のためにそれをするはずですが、それは最後のもののためにそれをしています – JCM

答えて

0

エラーについて:

New transaction is not allowed because there are other threads running in the session

あなたの接続が積極的に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) 

ワンコメントけれども、(この場合はループの外側)の代わりに、ループ内で一斉に変更を保存するために、一般的にお勧めです。特に、繰り返し回数が多い場合、処理時間が大幅に短縮され、処理時間が短縮されます。あるいは、何らかのタイプのバッチ処理カウンタを使用して、%operator(mod)を使用してすべてのXXX反復を保存することができます。

免責事項:私は、あなたのクエリ自体のようなあなたの他のコードを見ていないあなたは

+0

これは 'MU_w_o_No Work'に1つの結果しか生成しません – JCM

0

を述べただけで当面の問題は、私は私が私がifステートメントを追加する必要が私のforeach文で間違って何をしたか理解それはそこに何も値がそうここに存在しない場合、それはゼロであると仮定することはできませんのでitem2.NWTotalはゼロである私のforeach文はどのように見えるかです:あなたはそれが唯一の `MU_By_Machine` inste 1を挿入していますことを

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(); 
関連する問題