You used a Func<T,bool>
rather than an Expression<Func<T,bool>>
and so you've forced (somewhere) a transition from the database Linq-to-Entities to Linq-to-Objects. So it's processed in memory.
And, as @Marc points out, a simple fix may be:
public virtual List<T> Find(Expression<Func<T, bool>> where = null)
...
But that, in turn, depends on whether the calling code is in a form that can generate either of Func<T,bool>
or Expression<Func<T,bool>>
(usually, a lambda will be convertible to either form)