微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ASP.NET MVC 2中的asp.net-mvc-2 – LazyList vs System.Lazy>

在Rob Conery的Storefront系列中,Rob广泛使用了LazyList&构造来从IQueryable拉取数据.

>如何与System.Lazy< ...>现在可以在.NET 4.0(或许更早)中构建?

基于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< T>的所有结果.初始化发生在您首次访问任何IList< T>成员.

使用示例将是

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

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

使用示例将是

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

我们可以重写LazyList< T>使用Lazy< T>如下:

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

简而言之:LazyList< T>仅适用于IQueryable< T>,Lazy< T>适用于任何类型.

LazyList< T>是针对何时希望IQueryable< T>的结果的具体用例.作为列表< T>,但您不希望评估发生,直到您使用它.

更新回答扩大问题:

Would you recommend one over the other if I wanted to operate on IQueryable as a List<T>?
I’m assuming that since Lazy<T> is in the framework Now,it is a safer bet for future support and maintainability?

我个人不会使用.如果你有一个IQueryable我会保持它作为一个IQueryable,以最大限度地发挥你的灵活性.通过保持IQueryable,您仍然可以访问LINQ to sql查询理解(只要上下文仍然存在).

例如,如果在IQueryable上调用.ToList(),您将要求LINQ to sql从目标表中选择所有列,并将所有结果进行合并(这可能非常昂贵,尤其是如果您有数千个结果).这将被转换为“SELECT * FROM MyTable”.

如果您在IQueryable上调用.Count(),您将要求LINQ to sql获取结果数,这将被转换为“SELECT COUNT(*)FROM MyTable”.这样做比将所有的结果都保湿得更有效率,然后对它们进行计数,特别是如果你只对数字感兴趣的话!

通过使用.Where()在IQueryable LINQ to sql添加您的条件到SQL查询中的WHERE子句.这意味着您只会从您感兴趣的sql提取数据,而不是水化您无意使用的结果.

你会看到,通过保持IQueryable,你可以使自己更加灵活.大多数时候它会给你更好的表现,而不是整理结果集.

If I want to use a strong type instead of an anonymous (var) type would the following statements be functionally equivalent?

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

我认为你的匿名打字与隐含的打字混淆.使用var关键字声明的变量被隐式输入,以匹配分配给它的类型.它是强类型的,因此在初始赋值后不能更改.

这两个语句在功能上并不等同. LazyList< Product>是一种IList<产品>&< Lazy< List< Product>>是包含List< Product>的包装器.因为你有兴趣在一个懒惰的评估列表上运行,所以我会说LazyList可能更具体到你的目的.

你应该问自己,如果你真的需要一个实际的产品清单.如果没有一个令人信服的理由有一个实际的列表我会坚持使用IQueryable.

原文地址:https://www.jb51.cc/aspnet/249728.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐