2012-04-03 18 views
0

我有一個數組填充長型值和我需要實現一個查詢數組中的每個值。我用foreach循環,你可以從下面的代碼中看到:如何定義一個List來在循環中添加查詢的結果?

var result; 
     foreach(long id in PrdIdArr) 
     { 
      var mainQuery = (from o in db.OPERATIONs 
          join u in db.UNITs on o.OP_UNIT_ID equals u.UNIT_ID into smt 
          from s in smt 
          join x in db.XIDs on s.UNIT_ID equals x.UNIT_ID 
          where o.OP_OT_CODE == OtCode 
          where x.IDTYP_CD == "BSN" 
          where s.START_PRD_ID == id 
          where o.OP_UPD_DATE >= _StartDate 
          where o.OP_UPD_DATE <= _EndDate 
          select new 
          { 
           o.OP_ID, 
           o.OP_UPD_DATE, 
           x.EXTERNAL_ID, 
           o.OP_OS_CODE, 
           o.OP_START, 
           o.OP_ST_STATION, 
           s.START_PRD_ID 
          }).Take(_RowNumber); 
      //var result = mainQuery.ToList(); 
      result.add(mainQuery.ToList()); 
     } 

     data = this.Json(result); 
     data.JsonRequestBehavior = JsonRequestBehavior.AllowGet; 
     return data; 

但是,我有我的代碼中的問題;我必須在foreach循環之前定義一個主列表,以便將每個查詢的結果添加到該主列表中。我的問題是:我如何定義這個列表,就像你可以在代碼的開頭看到的那樣?感謝您的幫助...

回答

1

如何定義此列表,因爲您可以在我的代碼開頭看到?

new { 
    o.OP_ID, 
    o.OP_UPD_DATE, 
    x.EXTERNAL_ID, 
    o.OP_OS_CODE, 
    o.OP_START, 
    o.OP_ST_STATION, 
    s.START_PRD_ID 
} 

到一個具體類型(比如QueryResult,雖然東西多一點比這更具體的),然後就宣佈

var result = new List<QueryResult>(); 

此外,你應該考慮將

foreach(long id in PrdIdArr) 

where s.START_PRD_ID == id 

where PrdIdArr.Contains(s.Start_PRD_ID) 
0
var result = new List<object>(); 

    foreach(long id in PrdIdArr) 
    { 
     .... 

     result.Add(mainQuery.ToList()); 
    } 
+0

請確保不要直接在您的操作方法中針對數據庫進行查詢。爲此創建一個Repository類。這將有助於保持項目清潔,並專注於控制器內真正需要完成的工作。 – Max 2012-04-03 14:00:56

+0

當我使用()時,會在「result.Add(mainQuery.ToList());」行處給出錯誤。 :「Systems.Collections.Generic:List '不包含'add'的定義,並且沒有擴展方法'add'接受類型爲'Systems.Collections.Generic:List '的第一個參數...... 。「 – 2012-04-03 14:12:25

+0

」add「必須是」Add「! C#區分大小寫。 – Max 2012-04-04 09:15:19

0

只需之外創建匿名類型,具有相同屬性名稱和正確類型

var result = Enumerable.Range(0, 0).Select(x => new 
      { 
       OP_ID = 1, 
       OP_UPD_DATE = DateTime.Now, 
       EXTERNAL_ID = 1, 
       OP_OS_CODE = 1, 
       OP_START = DateTIme.Now, 
       OP_ST_STATION = "", 
       START_PRD_ID = 1, 
      }).ToList(); 

而且在循環調用AddRange

result.AddRange(mainQuery.ToList()); 
0

你可以這樣做:

var result = PrdIdArr.Select(id => 
    from o in db.OPERATIONs 
     join u in db.UNITs on o.OP_UNIT_ID equals u.UNIT_ID into smt 
     from s in smt 
     join x in db.XIDs on s.UNIT_ID equals x.UNIT_ID 
     where o.OP_OT_CODE == OtCode 
     where x.IDTYP_CD == "BSN" 
     where s.START_PRD_ID == id 
     where o.OP_UPD_DATE >= _StartDate 
     where o.OP_UPD_DATE <= _EndDate 
     select new 
     { 
      o.OP_ID, 
      o.OP_UPD_DATE, 
      x.EXTERNAL_ID, 
      o.OP_OS_CODE, 
      o.OP_START, 
      o.OP_ST_STATION, 
      s.START_PRD_ID 
     } 
     .Take(_RowNumber) 
     .ToList() 
    ).ToList(); 

我強烈建議執行一些Extract Method重構,因爲代碼是相當複雜的,很難理解/奶源這種方式。

相關問題