LazyList vs System.Lazy > dans ASP.NET MVC 2?
-
01-10-2019 - |
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:
- recommanderiez-vous un sur l'autre si je voulais opérer
IQueryable
commeList<T>
?
Je suppose que depuisLazy<T>
est dans le cadre maintenant, il est un pari plus sûr pour le soutien futur et la maintenabilité? - 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>();
-
La solution
Le LasyList
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
Exemple d'utilisation serait
var lazyString = new Lazy(() => "Hello world");
//initialization occurs here
Console.Write(lazyString.Value);
Nous pourrions réécrire le LazyList
var myList = new Lazy(() => products.Where(p => p.Name.StartsWith("T").ToList());
//initialization occurs here
Console.Write(myList.Value.Count);
En bref: LazyList
LazyList
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
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.