Question

série Storefront Dans Rob Conery, Rob fait un usage intensif de la construction de LazyList<..> aux données de traction de IQueryables.

  • Quelle est la différence de la construction System.Lazy<...> maintenant disponible dans .NET 4.0 (et peut-être plus tôt)?

Plus profondeur basée sur une grande réponse DoctaJones:

  1. recommanderiez-vous un sur l'autre si je voulais opérer IQueryable comme List<T>?
    Je suppose que depuis Lazy<T> est dans le cadre maintenant, il est un pari plus sûr pour le soutien futur et la maintenabilité?
  2. Si je veux utiliser un type fort au lieu d'un type anonyme (var) seraient les énoncés suivants fonctionnellement équivalent?
    • Lazy<List<Products>> Products = new Lazy<List<Product>>();
    • LazyList<Product> = new LazyList<Product>();
Était-ce utile?

La solution

Le LasyList fonctionne uniquement avec un IQueryable source . Il est une implémentation de IList et fonctionne en un peuplant Liste privée avec tous les résultats de la IQueryable spécifiée . L'initialisation se produit la première fois que vous accédez à un IList membres.

Exemple d'utilisation serait

var myList = new LazyList(products.Where(p => p.Name.StartsWith("T"));
//initialization occurs here
Console.Write(myList.Count);

Le System.Lazy fonctionne avec une classe type et ne se limite pas à IQueryable . l'initialisation tardive se produit la première fois le Lazy .Value propriété est accessible.

Exemple d'utilisation serait

var lazyString = new Lazy(() => "Hello world");
//initialization occurs here
Console.Write(lazyString.Value);

Nous pourrions réécrire le LazyList exemple utiliser Lazy comme suit:

var myList = new Lazy(() => products.Where(p => p.Name.StartsWith("T").ToList());
//initialization occurs here
Console.Write(myList.Value.Count);

En bref: LazyList fonctionne uniquement avec IQueryable , Lazy fonctionne avec tout type.

LazyList est-pour le cas d'utilisation spécifique lorsque vous voulez que les résultats d'un IQueryable comme List , mais vous ne voulez pas l'évaluation de se produire jusqu'à ce que vous l'utilisez.


Mise à jour pour répondre à la question élargie:

  

recommanderiez-vous un sur l'autre si je voulais opérer IQueryable comme une liste ?   Je suppose que depuis Lazy est dans le cadre maintenant, il est un pari plus sûr pour le soutien futur et la maintenabilité?

Personnellement, je ne pas utiliser non plus. Si vous avez un IQueryable je garderais comme un IQueryable pour maximiser votre flexibilité. En gardant le IQueryable vous obtenez toujours l'accès à LINQ à la compréhension des requêtes SQL (tant que le contexte est encore en vie).

Par exemple, si vous appelez .ToList () sur un IQueryable vous demandez LINQ to SQL pour sélectionner tous des colonnes de la table cible et hydrate tous les résultats (ce qui pourrait être très coûteux, surtout si vous avez des milliers de résultats). Cela se traduit à quelque chose comme "SELECT * FROM MyTable".

Si vous appelez .Count () sur le IQueryable vous demandez LINQ to SQL pour obtenir exactement le nombre de résultats, cela se traduit à quelque chose comme "SELECT COUNT (*) FROM MyTable". Faire cela est beaucoup plus efficace que l'hydratation de tous les résultats, puis les compter, surtout si vous ne souhaitez que le nombre!

En utilisant .Lorsque () sur le IQueryable LINQ to SQL ajoutera vos conditions à la clause WHERE dans la requête SQL. Cela signifie que vous n'extraire les données de SQL que vous intéresse, plutôt que les résultats que vous avez hydratant pas l'intention d'utiliser.

Vous voyez, en gardant la IQueryable vous rendre les choses beaucoup plus flexible pour vous-même. La plupart du temps, il vous donnera de meilleures performances que l'ensemble hydratant résultat.

  

Si je veux utiliser un type fort au lieu d'un anonyme (var) de type seraient les énoncés suivants fonctionnellement équivalent?

Lazy<List<Product>> products = new Lazy<List<Product>>(); 
LazyList<Product> products = new LazyList<Product>();

Je pense que vous obtenez frappe anonyme confondu avec la saisie implicite. Une variable déclarée en utilisant le mot-clé var est tapé implicitement pour correspondre au type qui est attribué. Il est fortement typé et ne peut donc pas être modifié après l'attribution initiale.

Les deux déclarations ne sont pas fonctionnellement équivalents. Le LazyList est un IList , wheras Lazy > est une enveloppe qui contient une liste . Parce que vous êtes particulièrement intéressé à opérer sur une liste évaluée paresseuse, je dirais que le LazyList est probablement plus specIFIC à vos besoins.

Vous devriez vous demander si vous vraiment besoin d'une liste réelle des produits. S'il n'y a pas une raison impérieuse d'avoir une liste réelle je bâton avec le IQueryable.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top