【问题标题】:Is checking IQueryable<T>.Any() necessary?检查 IQueryable<T>.Any() 是否必要?
【发布时间】:2012-08-27 09:04:53
【问题描述】:

我有一些方法可以链接到其他方法,传递 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”和几个我用来扩展查询的扩展方法。

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

【问题讨论】:

  • 性能问题....最好是与Stopwatch 或类似的方式进行检查并将其作为答案发布,
  • 实际上不需要检查'Any()'。但是,您应该检查“IQueryable”是否为空!
  • 性能优化的前三条规则:measure,measure,measure。
  • @BigYellowCactus - 我可以对其进行测试,但它可能会在不同的情况下给出不同的结果 - 我正在寻找“它是更好的做法”的答案

标签: c# .net linq


【解决方案1】:

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

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

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

【讨论】:

  • 感谢 usr - 与上面第一个类似的答案,但投了赞成票。
【解决方案2】:

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

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

【讨论】:

  • 这就是我想要的,一个真实的答案。
猜你喜欢
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
  • 2020-12-27
  • 2012-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多