LINQ Where

LINQ Where

Всем доброго времени суток. На связи Алексей Гулынин. Продолжаем работать с Entity Framework. В данной статье я бы хотел начать разбирать технологию LINQ To Entities. В SQL есть оператор WHERE, который служит для фильтрации данных. В LINQ тоже есть специальный метод Where(), который служит для этих же целей. В данной статье мы как раз и рассмотрим Where в LINQ. Для начала создадим класс "Country", который будет описывать нашу базу данных. Данный класс будет иметь следующие свойства: id, name (название страны), capital (столица), population (численность населения):

class Country
{
  // id
  public int Id { get; set; }
  // Название страны
  public string Name { get; set; }
  // Столица
  public string Capital { get; set; }
  // Численность населения
  public long Population { get; set; }
}

Строка подключения будет иметь следующий вид:

<connectionStrings>
  <add name="MyEFDB" connectionString="data source=(LocalDb)\v11.0;initial catalog=MyEFDB;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework" providerName="System.Data.SqlClient" />
</connectionStrings>

Класс "MyEFDB" (контекст) будет иметь следующий вид:

using System.Data.Entity;

namespace TestProject
{
  class MyEFDB: DbContext
  {
    public MyEFDB(): base("name=MyEFDB")
    { }
    public virtual DbSet<Country> Countries { get; set; }
  }
}

Сначала занесём в базу данных тестовые значения, чтобы было с чем работать. Ограничимся пятью записями. Методы расширений LINQ возвращают два объекта: IEnumerable (интерфейс, который находится в пространстве имен System.Collections) и IQueryable (интерфейс — пространство имен System.Linq).

Класс "Program":

using System;
using System.Data.Entity;
using System.Collections.Generic;
using System.Linq;

namespace TestProject
{
  class Program
  {
    static void Main(string[] args)
    {
      Database.SetInitializer(new DropCreateDatabaseAlways<MyEFDB>());

      using (MyEFDB db = new MyEFDB())
      {
        Country country1 = new Country { Name = "Russia", Capital = "Moscow", Population = 145000000 };
        Country country2 = new Country { Name = "France", Capital = "Paris", Population = 67000000 };
        Country country3 = new Country { Name = "England", Capital = "London", Population = 53000000 };
        Country country4 = new Country { Name = "Germany", Capital = "Berlin", Population = 82000000 };
        Country country5 = new Country { Name = "Spain", Capital = "Madrid", Population = 46000000 };

        db.Countries.AddRange(new List<Country> { country1, country2, country3, country4, country5 });
        db.SaveChanges();

        // Интерфейс IEnumerable
        IEnumerable<Country> countries = db.Countries.ToList();
        IEnumerable<Country> countries_result1;
        IEnumerable<Country> countries_result2;
        IEnumerable<Country> countries_result3;
        // Интерфейс IQueryable
        //IQueryable<Country> countries = db.Countries;
        // Получаем страны с населением более 100 млн. человек
        countries_result1 = countries.Where(c => c.Population > 100000000);
        Console.WriteLine("Выборка 1: ");
        // Здесь будет только Россия
        foreach (var country in countries_result1)
        {
          Console.WriteLine("{0} : {1}", country.Name, country.Capital);
        }

        // Получаем страны с населением более 60 млн. человек, но менее 100 млн.
        countries_result2 = countries.Where(c => c.Population > 60000000 && c.Population < 100000000);
        Console.WriteLine("Выборка 2: ");
        // Здесь будут Германия и Франция
        foreach (var country in countries_result2)
        {
          Console.WriteLine("{0} : {1}", country.Name, country.Capital);
        }

        // Получаем страны с населением более 80 млн. человек или равным 46 млн. человек			
        countries_result3 = countries.Where(c => c.Population > 80000000 || c.Population == 46000000);
        Console.WriteLine("Выборка 3: ");
        // Здесь будут Россия, Германия, Испания
        foreach (var country in countries_result3)
        {
          Console.WriteLine("{0} : {1}", country.Name, country.Capital);
        }

      }

      Console.WriteLine("Нажмите клавишу для продолжения...");
      Console.ReadLine();
    }
  }
}

Строка "countries.Where(c => c.Population > 100000000)" соответствует следующему запросу SQL:

SELECT Name, Capital FROM Countries WHERE Population > 100000000

Строка "countries.Where(c => c.Population > 60000000 && c.Population < 100000000)":

SELECT Name, Capital FROM Countries WHERE Population > 60000000 AND Population < 100000000

Строка "countries.Where(c => c.Population > 80000000 || c.Population == 46000000)":

SELECT Name, Capital FROM Countries WHERE Population > 80000000 OR Population = 46000000

В данной статье мы рассмотрели Where в LINQ.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *