Are below comments correct about DEFERRED EXECUTION?
1. var x = dc.myTables.Select(r=>r);//yes
2. var x = dc.myTables.Where(..).Select(r=>new {..});//yes
3. var x = dc.myTables.Where(..).Select(r=>new MyCustomClass {..});//no
In other words, I always thought projecting custom class objects will always cause eager execution. But I couldn't find references supporting/denying it (though I am seeing results contradicting it, hence the post)
Every statement in your question is an example of deferred execution. The contents of the Select
and Where
statement have no effect on whether or not the resulting value is deferred executed or not. The Select
+ Where
statements themselves dictate that.
As a counter example consider the Sum
method. This is always eagerly executed irrespective of what the input is.
var sum = dc.myTables.Sum(...); // Always eager
To prove your point, your test should look like this:
var tracer = string.Empty;
Func<inType, outType> map = r => {
tracer = "set";
return new outType(...);
}
var x = dc.myTables.Where(..).Select(map);
// this confirms x was never enumerated as tracer would be "set".
Assert.AreEqual(string.Empty, tracer);
// confirm that it would have enumerated if it could
CollectionAssert.IsNotEmpty(x);
It has been my observation that the only way to force execution right away is to force iteration of the collection. I do this by calling .ToArray()
on my LINQ.
Generally methods that return a sequence use deferred execution:
IEnumerable<X> ---> Select ---> IEnumerable<Y>
and methods that return a single object doesn't:
IEnumerable<X> ---> First ---> Y
So, methods like Where
, Select
, Take
, Skip
, GroupBy
and OrderBy
use deferred execution because they can, while methods like First
, Single
, ToList
and ToArray
doesn't because they can't.
from here
.Select(...)
is always deferred.
When you're working with IQueryable<T>
, this and other deferred execution methods build up an expression tree and this isn't ever compiled into an actual executable expression until it's iterated. That is, you need to:
.Any(...)
, .Count(...)
, .ToList(...)
, ...).
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.