Sobes.tech
Middle
180
questionbank

Приведите пример выполнения кода, в котором возвращается объект интерфейса IQueryable.

Ответ от нейросети

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 может оптимизировать запрос, отправляя только необходимые данные из источника.
  • Гибкость: Позволяет комбинировать и изменять запросы динамически перед их выполнением.