1

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

如您所见,有一个启动器“交易”和几个扩展方法,我使用它们来扩展查询。

在这种情况下,在查询语句之前检查并返回 where !IQueryable.Any() 是明智的,还是没关系?

4

2 回答 2

5

我看不到它会更快的情况。如果Any返回false,则列表无论如何都不会包含任何元素。所以你不节省网络带宽,而且服务器端执行计划不太可能好得多。

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

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

于 2012-08-27T09:25:31.830 回答
1

如果 ,它可能会更快,Any() == true但差异可能可以忽略不计。

另一方面,如果查询返回某些内容,则它可能会显着变慢,因为您有两次到数据库的往返。一是查询是否有任何东西,二是实际检索数据。

于 2012-08-27T09:20:29.100 回答