Middle
179
questionbank
Приведите пример выполнения кода, в котором возвращается объект интерфейса IQueryable.
Answer from AI
sobes.tech AI
using System;
using System.Linq;
using System.Collections.Generic;
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
public class ProductRepository
{
private List<Product> _products = new List<Product>
{
new Product { Id = 1, Name = "Laptop", Price = 1200.00m },
new Product { Id = 2, Name = "Keyboard", Price = 75.00m },
new Product { Id = 3, Name = "Mouse", Price = 25.00m }
};
// Метод возвращает IQueryable<Product>, позволяющий отложить выполнение запроса.
public IQueryable<Product> GetQueryableProducts()
{
return _products.AsQueryable(); // AsQueryable() преобразует IEnumerable в IQueryable
}
}
public class Program
{
public static void Main(string[] args)
{
var repository = new ProductRepository();
// Получение IQueryable<Product>
IQueryable<Product> query = repository.GetQueryableProducts();
// Добавление условия фильтрации к IQueryable.
// Запрос еще не выполнен на этом этапе.
IQueryable<Product> filteredQuery = query.Where(p => p.Price > 100.00m);
// Выполнение запроса при материализации (например, вызове ToList()).
// Здесь происходит запрос к источнику данных (в данном случае, к _products).
List<Product> expensiveProducts = filteredQuery.ToList();
Console.WriteLine("Expensive Products (Price > $100):");
foreach (var product in expensiveProducts)
{
Console.WriteLine($"- {product.Name} (${product.Price})");
}
Console.ReadKey();
}
}
Объяснение:
- Метод
GetQueryableProductsвProductRepositoryвозвращаетIQueryable<Product>с использованием метода расширенияAsQueryable(). IQueryableпозволяет строить LINQ-запросы (например,.Where()) без немедленного выполнения.- Запрос выполняется только при "материализации", т.е. когда результат запроса фактически требуется, например, при преобразовании в список с помощью
.ToList()(или при итерации в циклеforeach). - Это дает возможность провайдеру LINQ (например, Entity Framework или LINQ to SQL) преобразовывать выражение запроса в соответствующий язык запросов (например, SQL) и выполнять его эффективно на стороне источника данных.
Преимущества использования IQueryable:
- Отложенное выполнение: Запрос выполняется только при необходимости получения данных.
- Улучшенная производительность: Провайдер LINQ может оптимизировать запрос, отправляя только необходимые данные из источника.
- Гибкость: Позволяет комбинировать и изменять запросы динамически перед их выполнением.