Выборка и проекция из базы данных

Данное руководство устарело. Актуальное руководство: Руководство по Entity Framework Core

Последнее обновление: 31.10.2015

Для выборки применяется метод Where. Выберем из бд все модели, производитель которых - "Samsung":

using(PhoneContext db = new PhoneContext())
{
    var phones = db.Phones.Where(p=> p.Company.Name=="Samsung");
    foreach (Phone p in phones)
        Console.WriteLine("{0}.{1} - {2}", p.Id, p.Name, p.Price);
}

Для выборки одного объекта мы можем использовать метод Find(). Данный метод не является методом Linq, он определен у класса DbSet:

Phone myphone = db.Phones.Find(3); // выберем элемент с id=3

Но в качестве альтернативы мы можем использовать методы Linq First()/FirstOrDefault(). Они получают первый элемент выборки, который соответствует определенному условию. Использование метода FirstOrDefault() является более гибким, так как если выборка пуста, то он вернет значение null. А метод First() в той же ситуации выбросит ошибку.

Phone myphone = db.Phones.FirstOrDefault(p=>p.Id==3);
if(myphone!=null)
	Console.WriteLine(myphone.Name);

Теперь сделаем проекцию. Допустим, нам надо добавить в результат выборки название компании. Мы можем использовать метод Include для подсоединения к объекту связанных данных из другой таблицы: var phones = db.Phones.Include(p=>p.Company). Но не всегда нужны все свойства выбираемых объектов. В этом случае мы можем применить метод Select для проекции извлеченных данных на новый тип:

using(PhoneContext db = new PhoneContext())
{
    var phones = db.Phones.Select(p => new 
	{ 
		Name = p.Name, 
		Price = p.Price, 
		Company = p.Company.Name 
	});
    foreach (var p in phones)
        Console.WriteLine("{0} ({1}) - {2}", p.Name, p.Company, p.Price);
}

В итоге метод Select из полученных данных спроецирует новый тип. В даном случае мы получим данные анонимного типа, но это также может быть определенный пользователем тип. Например:

public class Model
{
    public string Name { get; set; }
    public string Company { get; set; }
    public int Price { get; set; }
}

И спроецируем выборку на этот тип:

var phones = db.Phones.Select(p => new Model 
{ 
	Name = p.Name, 
	Price = p.Price, 
	Company = p.Company.Name 
});
foreach (Model p in phones)
    Console.WriteLine("{0} ({1}) - {2}", p.Name, p.Company, p.Price);
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850