2012-08-27 5 views
1

J'ai des méthodes qui ensuite enchaînent sur d'autres, en passant IQueryable. Voici un échantillon réduit.Vérifie IQueryable <T> .Any() nécessaire?

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

Comme vous pouvez le voir, il y a une entrée « » et offres deux méthodes d'extension que j'utiliser pour étendre la requête.

Dans ce scénario, il est sage de vérifier et de retourner où! IQueryable.Any() en termes de performance avant l'instruction de requête, ou cela n'aura pas d'importance?

+3

Pourquoi ne pas simplement le tester? – sloth

+0

Question de performance .... le mieux serait de vérifier avec un 'chronomètre' ou comme sage et postez-le comme une réponse, – V4Vendetta

+0

Il n'est en fait pas nécessaire de vérifier 'Any()'. Vous devriez cependant vérifier que le 'IQueryable ' n'est pas nul! – Franky

Répondre

1

Il pourrait être plus rapide, si Any() == true, mais la différence sera probablement négligeable. D'autre part, il peut être sensiblement plus lent, si la requête renvoie quelque chose, car vous avez alors deux allers-retours à la base de données. Une pour interroger s'il y a quelque chose, la seconde pour récupérer réellement les données.

+0

C'est ce que je cherchais, une vraie réponse du monde. – dotnetnoob

5

Je ne peux pas voir un cas où ce serait plus rapide. Si Any renvoie false, la liste n'aurait contenu aucun élément de toute façon. Vous ne sauvegardez donc pas la bande passante du réseau et il est peu probable que le plan d'exécution côté serveur soit meilleur.

Si Any retours vrai vous venez introduit un aller-retour inutile et et l'exécution des requêtes inutiles.

Cela pourrait être plus rapide par coïncidence, mais pas de manière prévisible et valable.

+0

Merci usr - réponse similaire à ci-dessus qui a été le premier, mais a voté. – dotnetnoob

Questions connexes