我有方法然后链接到其他人,传递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()在查询语句之前的性能方面是明智的,还是无关紧要?
答案 0 :(得分:5)
我看不出会更快的情况。如果Any
返回 false ,则列表无论如何都不会包含任何元素。因此,您不会节省网络带宽,并且服务器端执行计划不太可能更好。
如果Any
返回 true ,您刚刚引入了不必要的往返和不必要的查询执行。
巧合可能更快,但不是以可预测的,有价值的方式。
答案 1 :(得分:1)
如果Any() == true
可能会更快,但差异可能会微不足道。
另一方面,如果查询返回一些东西,它可能会明显变慢,因为你有两次往返数据库。一个用于查询是否有任何内容,其次是实际检索数据。