2012-04-03 1 views
0

У меня есть массив, заполненный длинными значениями типа, и для каждого значения в массиве мне нужно реализовать запрос. Я использовал цикл по каждому элементу, как вы можете видеть из приведенной ниже коды:Как определить список для добавления результатов запроса в цикле?

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

Убедитесь, что вы не запрашиваете DB непосредственно в вашем методе действий. Создайте для этого класс репозитория. Это поможет сохранить ваш проект в чистоте и сосредоточиться на том, что действительно нужно делать в ваших контроллерах. – Max

+0

Когда я использую (), он дает ошибку в строке «result.Add (mainQuery.ToList()); : «Systems.Collections.Generic: List » не содержит определения для «add» и не используется метод расширения «add», принимающий первый аргумент типа «Systems.Collections.Generic: List » ... . « –

+0

« Добавить »должно быть« Добавить »! C# чувствителен к регистру. – Max

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 рефакторинга, поскольку код является довольно сложным и трудно понять/чесотки этот путь.

Смежные вопросы