2017-02-07 4 views
0

Мне было интересно, можно ли сохранить результаты нескольких запросов linq в одном IQueryable?Хранение результатов нескольких запросов linq в IQueryable

У меня есть запрос, который я использую в Еогеасп:

//Where OnDemandHistory is the table 
IOrderedQueryable<OnDemandHistory> A; 

foreach (int id in machineID) 
{ 
    A = OnDemandHistory.Where(c => c.MachineID == id).OrderByDescending(c => c.ODHisDate); 
    // I want to Order all results before writing to the table 
    foreach(var entry in A) 
    {   
     // I add to a table based on all entries found in A 
    } 
} 

Я пытаюсь получить все записи, где машина ID матча. Нет. of MachineID изменяется (на основе пользователя).

Мне было интересно, могу ли я сделать OrderByDescending после того, как я сохранил все результаты запроса, но перед добавлением в таблицу.

Я знаю, что из-за внутреннюю foreach петли, что она не будет, однако, когда я пытаюсь сделать это:

foreach (int id in machineID) 
{ 
    A = OnDemandHistory.Where(c => c.MachineID == id).OrderByDescending(c => c.ODHisDate); 
    // I want to Order all results before writing to the table  
} 

foreach(var entry in A) 
{   
    // I add to a table based on all entries found in A 
} 

Я получаю локальную переменную A неинициализированной ошибки,

Как бы я решать это?

Заранее спасибо

ответ

1

ошибка вызвана тем, что в качестве конечного результата первого запроса производит только результат последнего значения machineID это может привести либо нулевой результат или uninitialisedvalue А, так должен быть инициализирован. Кроме того, я подозреваю, что A может быть простым списком.

Вам нужно что-то вроде:

A = new List<OnDemandHistory>(); 
foreach (int id in machineID) 
{ 
    A.AddRange(OnDemandHistory 
    .Where(c => c.MachineID == id).OrderByDescending(c => c.ODHisDate).ToList());   
} 
// order A here 

Затем запустить вторую петлю, проверив, что А имеет строки. Тем не менее, я подозреваю, что в LINQ более разумные способы конкатенировать часть запроса machineID как отдельный оператор LINQ.

+0

Я попробовал ваш код, он все еще производит такие же результаты, как и я, я добавил 'A.OrderByDescending (с => с. ODHisDate); ' И еще ничего –

+0

Вы пробовали отлаживать свой код и анализировать содержимое A с точкой останова перед началом второго цикла. Некоторые примеры данных плюс определение 'OnDemandHistory' помогут. –

+0

Ваш комментарий дал мне представление, которое помогло мне решить мою проблему. Я посмотрел на таблицу «OnDemandHistory» и выполнил аналогичный запрос, я отсортировал его по другому полю, а не по MachineID, Спасибо за вашу помощь, –

3

Вы можете сделать это намного проще, используя Contains заявление:

var result = OnDemandHistory.Where(c => machineID.Contains(c.MachineID)) 
          .OrderByDescending(c => c.ODHisDate); 
+0

Я пробовал этот метод раньше, у меня появилась ошибка преобразования «Невозможно преобразовать из int? В int " –

+0

Тогда, в зависимости от того, что такое' OnDemandHistory', вы можете использовать 'c.MachineID.GetValueOrDefault()' или 'c.MachineID.Value', считая, что' machineID' не содержит 0. –

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