检查IQueryable <t> .Any()是否必要?</t>

时间:2012-08-27 09:04:53

标签: c# .net linq

我有方法然后链接到其他人,传递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);
    }

正如您所看到的,有一个首发&#39; Deals&#39;以及一些我用来扩展查询的扩展方法。

在这种情况下,检查并返回where!IQueryable.Any()在查询语句之前的性能方面是明智的,还是无关紧要?

2 个答案:

答案 0 :(得分:5)

我看不出会更快的情况。如果Any返回 false ,则列表无论如何都不会包含任何元素。因此,您不会节省网络带宽,并且服务器端执行计划不太可能更好。

如果Any返回 true ,您刚刚引入了不必要的往返和不必要的查询执行。

巧合可能更快,但不是以可预测的,有价值的方式。

答案 1 :(得分:1)

如果Any() == true可能会更快,但差异可能会微不足道。

另一方面,如果查询返回一些东西,它可能会明显变慢,因为你有两次往返数据库。一个用于查询是否有任何内容,其次是实际检索数据。