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.
На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.