Как я могу определить список, чтобы добавить результаты запроса в цикле? - PullRequest
0 голосов
/ 03 апреля 2012

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

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, чтобы я мог добавить результаты каждого запроса в этот основной список.мой вопрос: как я могу определить этот список, как вы можете видеть в начале моего кода?Спасибо за помощь ...

Ответы [ 4 ]

1 голос
/ 03 апреля 2012

Как я могу определить этот список, как вы видите в начале моего кода?

Превратить

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 голосов
/ 03 апреля 2012

Вы можете сделать это:

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

Я настоятельно рекомендую выполнить Извлечение метода рефакторинги, так как код довольно сложный и трудный для понимания / управления таким образом.

0 голосов
/ 03 апреля 2012

Просто создайте анонимный тип снаружи с такими же именами свойств и правильным типом

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 голосов
/ 03 апреля 2012
var result = new List<object>();

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

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