开发者

Foreach loop problem for IQueryable object

开发者 https://www.devze.com 2023-01-02 06:48 出处:网络
Can we use foreach loop for IQueryable object? I\'d like to do something as follow: query = IQueryable<Myclass> = objDataContext.Myclass; // objDataContext is an object of LINQ datacontext class

Can we use foreach loop for IQueryable object?

I'd like to do something as follow:

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 = quer开发者_JAVA技巧y.Where(q => (q.f_id1 == i || q.f_id2 == i || q.f_id3 == i));
}

I get a wrong output as each time value of i is changed.


The problem you're facing is deferred execution, you should be able to find a lot of information on this but basically none of the code s being executed until you actually try to read data from the IQueryable (Convert it to an IEnumerable or a List or other similar operations). This means that this all happens after the foreach is finished when i is set to the final value.

If I recall correctly one thing you can do is initialize a new variable inside the for loop like this:

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

By putting it in a new variable which is re-created each loop, the variable should not be changed before you execute the IQueryable.


You dont need a for each, try it like this:

query = objDataContext.Myclass.Where(q => (arr1.Contains(q.f_id1) || arr1.Contains(q.f_id2) || arr1.Contains(q.f_id3));


this is because "i" is not evaluated until you really use the iterate the query collectionif not by that time I believe "i" will be the last.

0

精彩评论

暂无评论...
验证码 换一张
取 消