В серии Storefront Rob Conery Rob делает широкое применение LazyList<..>
создайте для получения по запросу данных из IQueryables
.
System.Lazy<...>
создайте теперь доступный в.NET 4.0 (и возможно ранее)?Больше глубины на основе большого ответа DoctaJones:
IQueryable
как a List<T>
?Lazy<T>
находится в платформе теперь, это - более безопасная ставка для будущей поддержки и пригодности для обслуживания?var
) тип следующие утверждения был бы функционально эквивалентен? Lazy<List<Products>> Products = new Lazy<List<Product>>();
LazyList<Product> = new LazyList<Product>();
LasyList
Пример использования:
var myList = new LazyList(products.Where(p => p.Name.StartsWith("T"));
//initialization occurs here
Console.Write(myList.Count);
Класс System.Lazy
Пример использования:
var lazyString = new Lazy(() => "Hello world");
//initialization occurs here
Console.Write(lazyString.Value);
Мы могли бы переписать пример LazyList
var myList = new Lazy(() => products.Where(p => p.Name.StartsWith("T").ToList());
//initialization occurs here
Console.Write(myList.Value.Count);
Вкратце: LazyList
LazyList
ОБНОВЛЕНИЕ, чтобы ответить на расширенный вопрос:
Вы бы порекомендовали одно другому, если бы я хотел работать с 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 > - это оболочка, содержащая List
Вы должны спросить себя, действительно ли вам нужен настоящий Список продуктов. Если нет веской причины для наличия реального списка, я бы остановился на IQueryable.