I have a supplying method in DAL:
public IEnumerable GetRecords()
{
using (LinqDataContext context = new LinqDataContext())
{
In the case of executing a basic query, it can work that way (certainly it is possible) - however, in the case of querying a naked Table, it might be that it all buffers first; you could perhaps try querying the count during the iteration, or running a trace. In this case I suspect it will buffer first.
Re closed: that also depends ;p If someone is using foreach, then yes: since foreach explicitly disposes the iterator via finally. However! It is not guaranteed if someone does, for example (very naughty and lax):
var iter = yourData.GetEnumerator();
if(iter.MoveNext()) {
Console.WriteLine(iter.Current.Name); // first record of, say, 20
}
// and don't dispose the iterator == bad
then since the iterator doesn't a: get disposed, b: exhaust itself, and c: doesn't crash, it won't shut down properly (any of those 3 conditions will close it properly). Emphasis: this is a pathological case: normally it is reasonably safe to say "it will close, yes".
If you want guaranteed non-buffering, note that "dapper" has that, if you set buffered to false:
IEnumerable customers = connection.Query(
"select * from Customer", buffered: false);
(it can also handle the parameters etc)