Стремительная загрузка с Entity Framework, LINQ
Я работаю над проектом ASP.NET MVC. Я использую EF код-первый подход. у меня есть 3 класса, которые:
public class A
{
public int AID {get;set;}
public string A1 {get;set}
public string A2 {get;set}
public virtual List<B> Bs {get;set;}
}
public class B
{
public int BID {get;set;}
public string B1 {get;set}
public string B2 {get;set}
public AID {get;set}
public virtual A A {get;set}
public virtual List<C> Cs {get;set;}
}
public class C
{
public int CID {get;set;}
public string C1 {get;set}
public string C2 {get;set}
public BID {get;set}
public virtual B B {get;set}
}
Я хочу выбрать только свойства C1 класса C на основе класса B, где A1 = 4 . я пытался использовать:
var result = db.C.select(x=>x.C1).Include(x=>B).where(x=>x.A.equals(4))
Я запутался и не знаю, как выполнить запрос linq. Кроме того, я не уверен, продолжать ли использовать нетерпеливую загрузку или прибегнуть к чему-то другому.
Пожалуйста, любой гуру может помочь мне, пожалуйста?
2 ответа
Попробуй это:
var result = db.C
.Where(c => c.B.A.A1 == 4)
.Select(c => c.C1)
.ToList()
Вам не нужно использовать Eager loading (Include
) здесь, потому что ни один из вложенных объектов не содержится в результате.
Стремительная загрузка используется для решения проблемы SELECT N + 1. Эта проблема возникает, когда вы извлекаете родительскую сущность и хотите перебрать ее дочерние элементы. Это приводит к N + 1 запросам к базе данных.
Вот примеры кода для иллюстрации:
Без нетерпеливой загрузки
var carList = db.Cars.ToList(); //this will create one request to the database to retrieve all cars
foreach(var car in carList)
{
foreach(var wheel in car.Wheels) //this line will create another request to the database to retrieve wheels for specific car
}
Console.Write("Car = {0}, Wheel = {1}", car, wheel);
}
}
//Total requests: 1 to get car list + N requests to retrieve wheels where N - total number of cars
С нетерпением загрузки
var carList = db.Cars.Include(x => x.Wheels).ToList(); //this will create one request to the database to retrieve all cars together with information about wheels
foreach(var car in carList)
{
foreach(var wheel in car.Wheels) //this line won't create extra request to the database because this data has been already loaded using eager loading
}
Console.Write("Car = {0}, Wheel = {1}", car, wheel);
}
}
//Total requests: 1 to get car list with all wheel information
По умолчанию EF использует отложенную загрузку, то есть вы не получите, пока не попросите об этом. Используйте ToList() или ToArray(), чтобы EF выполнял запрос к sql и помещал эти объекты в объекты памяти. Если вам нужно, вы можете выполнить сырой SQL-запрос, как YourDbContext.SqlQuery<T>("select * from ...")