Code Inspection: IQueryable is possibly unintentionally used as IEnumerable
Objects that implement the IQueryable interface are meant to be processed by LINQ providers (normally, remote databases) with their specific implementations of this interface.
IQueryable is inherited from IEnumerable, there could be cases when an
IQueryable object is passed and processed as an
IEnumerable object, meaning that all processing is done on the local machine. Such implicit conversions are not a problem in test environments, but could make a huge performance impact in production.
Suppose that you get an
IQueryable object from a database:
... and somewhere in your codebase there is a handy extension method for filtering out null items:
Now, let's see how we can use our queryable object:
ReSharper will detect such a conversion and suggest a fix to make it explicit:
Another example is method groups or expression trees, which should not be passed as 'Expression' objects in this case, and therefore trigger the same inspection. The same implicit conversion to
IEnumerable happens here and ReSharper suggests adding the explicit
.AsEnumerable() to the call: