I like LINQ very much, both the query comprehension and the extension methods. Most of my set-based logic looks much better in LINQ. There is however one scenario where blindly replacing foreach with LINQ is very dangerous. I’m talking about scenario when you need to return an IEnumerable from inside the “using” statement.
Consider having following (fake) code:
public IEnumerable<Order> Lookup(IEnumerable<int> orderIDs)
{
using (session = SessionFactory.OpenSession())
{
foreach (var orderID in orderIDs)
yield return session.Get<Order>(orderID )
}
}
Your first reaction may be to convert it to something like this:
public IEnumerable<Order> Lookup(IEnumerable<int> orderIDs)
{
using (session = SessionFactory.OpenSession())
{
return orderIDs.Select(orderID => session.Get<Order>(orderID));
//OR
return from orderID in orderIDs select session.Get<Order>(orderID);
}
}
Notice the problem? Yes, in the second case (with either query comprehension or extension method) the session will be Disposed immediately, long before the output of the function is enumerated!
