LazyList <T> по сравнению с Системой. Ленивый <Список <T>> в ASP.NET MVC 2?

В серии Storefront Rob Conery Rob делает широкое применение LazyList<..> создайте для получения по запросу данных из IQueryables.

  • Как это отличается от System.Lazy<...> создайте теперь доступный в.NET 4.0 (и возможно ранее)?

Больше глубины на основе большого ответа DoctaJones:

  1. Вы рекомендовали бы один по другому, если бы я хотел воздействовать на IQueryable как a List<T>?
    Я предполагаю это с тех пор Lazy<T> находится в платформе теперь, это - более безопасная ставка для будущей поддержки и пригодности для обслуживания?
  2. Если я хочу использовать сильный тип вместо анонимного (var) тип следующие утверждения был бы функционально эквивалентен?
    • Lazy<List<Products>> Products = new Lazy<List<Product>>();
    • LazyList<Product> = new LazyList<Product>();
12
задан Reinstate Monica 14 November 2019 в 11:49
поделиться

1 ответ

LasyList работает только с источником IQueryable . Это реализация IList и работает, заполняя частный список всеми результатами из указанного IQueryable . Инициализация происходит при первом доступе к любому из членов IList .

Пример использования:

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

Класс System.Lazy работает с любым типом и не ограничивается IQueryable . Ленивая инициализация происходит при первом обращении к свойству Lazy .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 , но вы не хотите, чтобы оценка выполнялась, пока вы не используете его.


ОБНОВЛЕНИЕ, чтобы ответить на расширенный вопрос:

Вы бы порекомендовали одно другому, если бы я хотел работать с IQueryable как List ? Я предполагаю, что, поскольку Lazy находится в фреймворк сейчас, это более безопасный вариант для будущей поддержки и удобства сопровождения?

Лично я бы тоже не стал использовать. Если у вас есть IQueryable, я бы оставил его как IQueryable, чтобы максимизировать вашу гибкость.Сохраняя IQueryable, вы по-прежнему получаете доступ к пониманию запросов LINQ to SQL (пока контекст все еще жив).

Например, если вы вызываете .ToList () в IQueryable, вы запрашиваете LINQ to SQL для выбора всех столбцов из целевой таблицы и гидратации всех результатов. (это может быть очень дорого, особенно если у вас тысячи результатов). Это будет переведено во что-то вроде «SELECT * FROM MyTable».

Если вы вызываете .Count () в IQueryable, вы запрашиваете LINQ to SQL просто получить количество результатов, это будет преобразовано во что-то вроде «SELECT COUNT (*) FROM MyTable». Это намного эффективнее, чем увлажнение всех результатов с последующим их подсчетом, особенно если вас интересует только число!

Использование .Where () в IQueryable LINQ to SQL добавит ваши условия в предложение WHERE в запросе SQL. Это означает, что вы будете извлекать только те данные из SQL, которые вас интересуют, а не улучшать результаты, которые вы не собираетесь использовать.

Видите ли, сохраняя IQueryable, вы делаете вещи более гибкими для себя. В большинстве случаев это даст вам лучшую производительность, чем увлажнение всего набора результатов.

Если я хочу использовать строгий тип вместо анонимного (var) типа, будут ли следующие утверждения функционально эквивалентны?

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

Я думаю, вы путаете анонимную типизацию с неявной типизацией. Переменная, объявленная с использованием ключевого слова var, неявно типизируется в соответствии с присвоенным ей типом.Он строго типизирован и поэтому не может быть изменен после первоначального назначения.

Эти два утверждения не являются функционально эквивалентными. LazyList - это IList , тогда как Lazy > - это оболочка, содержащая List . Поскольку вас особенно интересует работа со списком с отложенной оценкой, я бы сказал, что LazyList , вероятно, более специфичен для ваших целей.

Вы должны спросить себя, действительно ли вам нужен настоящий Список продуктов. Если нет веской причины для наличия реального списка, я бы остановился на IQueryable.

17
ответ дан 2 December 2019 в 19:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: