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);
    }

ご覧のとおり、スターター「Deals」と、クエリを拡張するために使用するいくつかの拡張メソッドがあります。

このシナリオでは、クエリステートメントの前にパフォーマンスの観点から !IQueryable.Any() をチェックして返すのが賢明ですか、それとも問題ではありませんか?

4

2 に答える 2

5

もっと速くなるケースは見当たらない。falseAnyを返す場合、リストにはとにかく要素が含まれていません。したがって、ネットワーク帯域幅を節約することはなく、サーバー側の実行プランがこれほど優れているとは考えられません。

trueAnyが返された場合は、不要なラウンドトリップと不要なクエリ実行が導入されています。

偶然の一致で速くなる可能性がありますが、予測可能で価値のある方法ではありません。

于 2012-08-27T09:25:31.830 に答える
1

の場合は高速になる可能性がありますAny() == trueが、違いはおそらく無視できます。

一方、クエリが何かを返す場合は、データベースへの往復が 2 回あるため、大幅に遅くなる可能性があります。1 つは何かがあるかどうかを照会し、2 番目は実際にデータを取得します。

于 2012-08-27T09:20:29.100 に答える