Нужна ли проверка IQueryable<T>.Any ()?
У меня есть методы, которые затем связываются с другими, передавая IQueryable. Вот урезанный образец.
public static IQueryable<Deal> Deals(this DbContext context)
{
Guard.ThrowIfNull(context, "context");
var r = new ReadRepo<Deal>(context);
return r.FindBy()
.Include("Deals_SitePost")
.Include("Deals_CommunityPost")
.Include("Deals_Preorder")
.Include("Deals_Product")
.Include("Deals_Sale")
.Include("Deals_VoucherCode")
.Include("DealSubcategories");
}
public static IQueryable<Deal> ByStore(this IQueryable<Deal> deals, int storeId)
{
return deals.Where(d => d.StoreId == storeId);
}
public static IQueryable<Deal> WhereFeatured(this IQueryable<Deal> deals)
{
return deals.Where(d => d.Deals_SitePost.IsNotNull() && d.Deals_SitePost.IsFeatured);
}
Как вы можете видеть, есть стартер 'Deals' и несколько методов расширения, которые я использую для расширения запроса.
В этом случае целесообразно проверить и вернуть где!IQueryable.Any() с точки зрения производительности перед оператором запроса, или это не будет иметь значения?
2 ответа
Это может быть быстрее, если Any() == true
, но разница, вероятно, будет незначительной.
С другой стороны, это может быть значительно медленнее, если запрос возвращает что-то, потому что тогда у вас есть два обращения к базе данных. Один для запроса, если есть что-либо вообще, второй для фактического получения данных.
Я не вижу случая, когда это было бы быстрее. Если Any
возвращает false, список не содержал бы элемент в любом случае. Таким образом, вы не экономите пропускную способность сети, и вряд ли план выполнения на стороне сервера будет намного лучше.
Если Any
возвращает true, вы только что ввели ненужные обходные пути и ненужное выполнение запросов.
Это может быть быстрее по совпадению, но не предсказуемым, стоящим способом.