Для тех, кто приходит сюда, еще одна вещь, которую стоит отметить:
Вы должны быть абсолютно уверены, что вы предоставляете выражение методу SingleOrDefault()
, в противном случае возможно следующее:
public static TEntity GetByID<TEntity>(this IEnumerable<TEntity> list, Func<TEntity,bool> selector) where TEntity : Identifiable
{
return list.SingleOrDefault(selector);
}
public static TEntity GetByID<TEntity>(this IQueryable<TEntity> list, Func<TEntity,bool> selector) where TEntity : Identifiable
{
return list.SingleOrDefault(selector);
}
Эти методы будут работать точно так же. ЗАЧЕМ? Поскольку вы не предоставляете выражение для списка IQueryable<>
, фактически получается, что список будет автоматически преобразован в IEnumerable<>
, а затем селектор будет запущен на IEnumerable<>
. Таким образом, фактически вы извлекаете всю таблицу / список из памяти в БД, а затем запускаете селектор в списке в памяти.
Я только что сделал это, и я думал, что схожу с ума.
Если вы передадите Expression<Func<TEntity,bool>>
в IQueryable<>
, это будет выполнено на стороне БД.