gpt4 book ai didi

c# - ASP.NET MVC 2 中的 LazyList 与 System.Lazy>?

转载 作者:行者123 更新时间:2023-12-01 23:13:24 26 4
gpt4 key购买 nike

在 Rob Conery 的店面系列中,Rob 广泛使用了 LazyList<..>构建从 IQueryables 提取数据.

  • 这与 System.Lazy<...> 有什么不同构造现在可以在 .NET 4.0(也许更早)中使用?
<小时/>

基于 DoctaJones 精彩答案的更多深度:

  1. 如果我想在 IQueryable 上进行操作,您会推荐其中一个吗?作为List<T>
    我假设从 Lazy<T> 开始现在已经在框架中了,对于 future 的支持和可维护性来说这是一个更安全的选择?
  2. 如果我想使用强类型而不是匿名 ( var ) 类型,以下语句在功能上是否等效?
    • Lazy<List<Products>> Products = new Lazy<List<Product>>();
    • LazyList<Product> = new LazyList<Product>();

最佳答案

LasyList<T>仅适用于 IQueryable<T>来源。它是 IList<T> 的实现并通过使用指定 IQueryable 的所有结果填充私有(private)列表来工作。第一次访问任何 IList 成员时都会进行初始化。

示例用法是

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

System.Lazy<T>类适用于任何类型,并且不限于 IQueryable Lazy<T>.Value 第一次发生延迟初始化属性已被访问。

示例用法是

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

我们可以重写 LazyList 示例以使用 Lazy ,如下所示:

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

简而言之: LazyList 仅适用于 IQueryable ,Lazy 适用于任何类型。

LazyList 适用于以下特定用例:您希望将 IQueryable 的结果作为 List ,但在使用它之前不希望进行计算。

<小时/>

更新回答扩展问题:

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 以最大限度地提高您的灵 active 。通过保留 IQueryable,您仍然可以访问 LINQ to SQL 的查询理解(只要上下文仍然存在)。

例如,如果您在 IQueryable 上调用 .ToList(),您将要求 LINQ to SQL 从目标表中选择所有列,并合并所有列结果(这可能非常昂贵,特别是如果您有数千个结果)。这将被翻译为“SELECT * FROM MyTable”之类的内容。

如果您在 IQueryable 上调用 .Count(),则要求 LINQ to SQL 仅获取结果数,这将被转换为类似“SELECT COUNT(*) FROM MyTable”的内容。这样做比合并所有结果然后对它们进行计数要有效得多,特别是如果您只对数字感兴趣的话!

通过在 IQueryable 上使用 .Where(),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 是一个 IList ,而 Lazy > 是包含 List 的包装器。因为您对在惰性评估列表上进行操作特别感兴趣,所以我认为 LazyList 可能更适合您的目的。

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

关于c# - ASP.NET MVC 2 中的 LazyList<T> 与 System.Lazy<List<T>>?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2689986/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com