ASP.NET MVC 2中的asp.net-mvc-2 – LazyList vs System.Lazy&g
在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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 初识ABP vNext(10):ABP设置管理
- ASP.net Web窗体,在编译时获取aspx /视图错误?
- asp.net-mvc-3 – ASP .NET MVC 3实体框架禁用代码优先
- 使用ashx / axd处理程序和使用我在ASP.NET中编写的东西之间
- asp.net-mvc-3 – 使用构造方法参数过滤的Ninject绑定属性
- asp.net-mvc – ASP.NET MVC中基础控制器类的好候选人是什么
- 树莓派-远程逗猫(二) —— 摄像头连接
- 在ASP.NET MVC4项目中包含jquery的正确方法
- asp.net – 如何在razor viewengine中实现foreach委托?
- asp.net – IE超时后重新发送请求?
- 晚绑定场景下对象属性赋值和取值可以不需要Prope
- asp.net-mvc – NHibernate与实体框架
- asp.net-mvc-2 – ASP.NET MVC 2和PRG模式
- asp.net – 如何让Html Link(锚点)回发像LinkBut
- asp.net – 是否有可能在代码隐藏中获取不可见的
- asp.net-mvc – 根据浏览器接受语言自动设置uiCu
- asp.net – 在Azure上增加AppPool超时的优点/缺点
- asp.net – 在Azure部署期间(彻底改变)Web.confi
- asp.net access web.config denied
- asp.net-web-api – 如何存储Web API访问令牌?