Am I misunderstanding LINQ to SQL .AsEnumerable()?
Consider this code:
var query = db.Table
.Where(t => SomeCondition(t))
.AsEnumerable();
int recordCount = query.Count();
int totalSomeNumber = query.Sum();
decimal average = query.Average();
Assume query
takes a very long time to run. I need to get the record count, total SomeNumber
's returned, and take an average at the end. I thought based on my reading that .AsEnumerable()
would execute the query using LINQ-to-SQL, then use LINQ-to-Objects for the Count
, Sum
, and Average
. Instead, when I do this in LINQPad, I see the same query is run three times. If I replace .AsEnumerable()
with .ToList()
, it only gets queried once.
Am I missing something about what AsEnumerable
is/does?
Solution 1:
Calling AsEnumerable(
) does not execute the query, enumerating it does.
IQueryable
is the interface that allows LINQ to SQL
to perform its magic. IQueryable
implements IEnumerable
so when you call AsEnumerable()
, you are changing the extension-methods being called from there on, ie from the IQueryable
-methods to the IEnumerable
-methods (ie changing from LINQ to SQL
to LINQ to Objects
in this particular case). But you are not executing the actual query, just changing how it is going to be executed in its entirety.
To force query execution, you must call ToList()
.
Solution 2:
Yes. All that AsEnumerable
will do is cause the Count
, Sum
, and Average
functions to be executed client-side (in other words, it will bring back the entire result set to the client, then the client will perform those aggregates instead of creating COUNT()
SUM()
and AVG()
statements in SQL).