加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-15 22:54:14 所属栏目:asp.Net 来源:网络整理
导读:在Rob Conery的Storefront系列中,Rob广泛使用了LazyList构造来从IQueryable拉取数据. 如何与System.Lazy ...现在可以在.NET 4.0(或许更早)中构建? 基于DoctaJones的更好的深度答案: 如果我想以IQueryable作为List T?来操作,你会推荐一个吗? 我假设自从La
在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.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读