Нужна ли проверка 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, вы только что ввели ненужные обходные пути и ненужное выполнение запросов.

Это может быть быстрее по совпадению, но не предсказуемым, стоящим способом.

Другие вопросы по тегам