在Rob Conery的Storefront系列中,Rob广泛使用LazyList<..>
构造从IQueryables
中提取数据。
System.Lazy<...>
构造有何不同?基于DoctaJones的出色答案的更多深度:
IQueryable
作为List<T>
进行操作,您是否会推荐一个?我假设由于Lazy<T>
现在在框架中,因此对于将来的支持和可维护性而言,这是一个更安全的选择吗?var
)类型,以下语句在功能上是否等效?Lazy<List<Products>> Products = new Lazy<List<Product>>();
LazyList<Product> = new LazyList<Product>();
LasyList<T>仅适用于IQueryable<T>信号源。它是IList<T>的实现,并通过使用来自指定IQueryable
示例用法为
var myList = new LazyList(products.Where(p => p.Name.StartsWith("T"));
//initialization occurs here
Console.Write(myList.Count);
System.Lazy<T>类可使用任何类型,并且不仅限于IQueryable
示例用法为
var lazyString = new Lazy(() => "Hello world");
//initialization occurs here
Console.Write(lazyString.Value);
我们可以重写LazyList
var myList = new Lazy(() => products.Where(p => p.Name.StartsWith("T").ToList());
//initialization occurs here
Console.Write(myList.Value.Count);
简而言之: LazyList
LazyList
更新以回答扩展的问题:
如果我想对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 >是包含List
您应该问自己是否真的
需要实际的产品清单。如果没有令人信服的理由拥有一个实际的列表,我会坚持使用IQueryable。