Задача цикла Foreach для объекта Iqueyable - PullRequest
3 голосов
/ 03 июня 2010

Можем ли мы использовать цикл foreach для объекта Iqueryable?

Я бы хотел сделать следующее:

query = Iqueryable<Myclass> = objDataContext.Myclass; // objDataContext is an object of LINQ datacontext class

int[] arr1 = new int[] { 3, 4, 5 };

foreach (int i in arr1)
{
query = query.Where(q => (q.f_id1 == i || q.f_id2 == i || q.f_id3 == i));
}

Это дает мне неправильный вывод, как каждый раз, когда значение меняется.

Ответы [ 3 ]

3 голосов
/ 03 июня 2010

Проблема, с которой вы сталкиваетесь, - это отложенное выполнение, вы должны быть в состоянии найти много информации об этом, но в основном ни один из кодов не выполняется, пока вы на самом деле не попытаетесь прочитать данные из IQueryable (преобразовать его в IEnumerable или Список или другие подобные операции). Это означает, что все это происходит после того, как foreach закончен, когда я установлен в окончательное значение.

Если я правильно помню, одну вещь, которую вы можете сделать, это инициализировать новую переменную внутри цикла for следующим образом:

foreach (int i in arr1)
{
   int tmp = i;
   query = query.Where(q => (q.f_id1 == tmp || q.f_id2 == tmp || q.f_id3 == tmp));
}

Помещая его в новую переменную, которая воссоздает каждый цикл, переменная не должна изменяться до выполнения IQueryable.

1 голос
/ 03 июня 2010

Вам не нужно для каждого, попробуйте это так:

query = objDataContext.Myclass.Where(q => (arr1.Contains(q.f_id1) || arr1.Contains(q.f_id2) || arr1.Contains(q.f_id3));
0 голосов
/ 03 июня 2010

это потому, что "i" не оценивается до тех пор, пока вы действительно не будете использовать итерацию коллекции запросов, если я не верю, что "i" будет последним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...