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< List< Products>> Products = new Lazy< List< 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>,但您不希望评估发生,直到您使用它. 更新回答扩大问题:
我个人不会使用.如果你有一个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,你可以使自己更加灵活.大多数时候它会给你更好的表现,而不是整理结果集.
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. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 使用其他bool字段进行MVC远程验证
- asp.net-mvc – “添加ASP.Net文件夹”未启用
- asp.net 4.0:是否有相当于ClientIDMode的INPUT的名称?
- asp.net-mvc – asp.net mvc – 需要存储当前请求的一些数据
- asp.net – 我可以在卫星装配中组合本地资源吗?
- asp.net-mvc – asp.net mvc使用.wml保持覆盖text/html内容
- .net – SqlConnection的Dispose方法是否会干扰连接池?
- asp.net-mvc – ASP.net身份在删除外部帐户后停止分发外部C
- .net – SqlBulkCopy超时
- asp.net – Internet Explorer 11在服务器端的检测
- asp.net-mvc-3 – 如何从控制器外部访问登录用户
- asp.net-core – 如何在ASP.NET 5 MVC中访问缓存
- asp.net – 可以在web.config中添加响应http头吗
- asp.net-mvc – MVC应用程序调试错误:viewstate
- 在asp.net中使用Eval()是什么
- asp.net-mvc – Kendo Grid导出到Excel – 所有页
- asp.net – 会话状态在此上下文中不可用
- ViewState在ASP.NET MVC中是否相关?
- asp.net-mvc – 转换常规的MVC网站,用于电话沟通
- asp.net-mvc-3 – ASP.Net MVC3路由保留字?
