LazyList 与ASP.NET MVC 2中的System.Lazy >相比?

问题描述 投票:12回答:1

在Rob Conery的Storefront系列中,Rob广泛使用LazyList<..>构造从IQueryables中提取数据。

  • 这与.NET 4.0(可能更早)中提供的System.Lazy<...>构造有何不同?

基于DoctaJones的出色答案的更多深度:

  1. 如果我想将IQueryable作为List<T>进行操作,您是否会推荐一个?我假设由于Lazy<T>现在在框架中,因此对于将来的支持和可维护性而言,这是一个更安全的选择吗?
  2. 如果我要使用强类型而不是匿名(var)类型,以下语句在功能上是否等效?
    • Lazy<List<Products>> Products = new Lazy<List<Product>>();
    • LazyList<Product> = new LazyList<Product>();
c# asp.net-mvc-2 lazy-loading asp.net-4.0 lazylist
1个回答
17
投票

LasyList<T>仅适用于IQueryable<T>信号源。它是IList<T>的实现,并通过使用来自指定IQueryable 的所有结果来填充私有列表。初始化在您第一次访问任何IList 成员。

时发生

示例用法为

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

System.Lazy<T>类可使用任何类型,并且不仅限于IQueryable 。第一次访问 Lazy<T>.Value属性时,将发生延迟初始化。

示例用法为

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

我们可以重写LazyList 示例以使用Lazy ,如下所示:

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

简而言之: LazyList 仅适用于IQueryable ,Lazy 适用于任何类型。

LazyList 用于特定的用例,当您希望将IQueryable 的结果作为List ,但是您不希望在使用它之前进行评估。


更新以回答扩展的问题:

如果我想对IQueryable作为List 进行操作,您会推荐另一个吗?我假设由于Lazy 现在已在框架中,因此对于将来的支持和可维护性而言,这是一个更安全的选择?

我个人都不用。如果您有一个IQueryable,我会将其保留为IQueryable,以最大程度地提高灵活性。通过保持IQueryable,您仍然可以访问LINQ来访问SQL的查询理解(只要上下文仍然存在)。

例如,如果您在IQueryable上调用.ToList(),您正在要求LINQ to SQL从目标表中选择列的[[all并合并结果[[all(这可能非常价格昂贵,尤其是如果您有成千上万的结果)。这将转换为类似“ SELECT * FROM MyTable”的内容。

如果在IQueryable上调用.Count(),则您要求LINQ to SQL仅获取结果数,这将转换为类似“ SELECT COUNT(*)FROM MyTable”的内容。这样做比混合所有结果然后计数它们要有效得多,特别是如果您只对数字感兴趣的话!通过在IQueryable LINQ to SQL上使用.Where(),会将条件添加到SQL查询中的WHERE子句中。这意味着您将只从您感兴趣的SQL中提取数据,而不是合并您不打算使用的结果。

您看到,通过保持IQueryable,您可以使事情变得更加灵活。在大多数情况下,它比混合整个结果集为您提供更好的性能。

如果我想使用强类型而不是匿名(var)类型,以下语句在功能上是否等效?

Lazy<List<Product>> products = new Lazy<List<Product>>(); LazyList<Product> products = new LazyList<Product>(); 我认为您正在将匿名键入与隐式键入混淆。使用var关键字声明的变量被隐式键入以匹配分配给它的类型。

是强类型的,因此在初始分配后不能更改。

这两个语句在功能上不相同。 LazyList 是IList ,而Lazy >是包含List 的包装。因为您特别希望对懒惰的评估列表进行操作,所以LazyList对于您的目的可能更具体。

您应该问自己是否真的

需要实际的产品清单。如果没有令人信服的理由拥有一个实际的列表,我会坚持使用IQueryable。
© www.soinside.com 2019 - 2024. All rights reserved.