Я знаю, как работают IQueryable
и IEnumerable
. Но сегодня, когда я пересматривал эти темы на примере.
Ниже приведены мои вопросы
Сколько вызовов в БД сделано?
Если я прав, то есть два вызова БД, один с where
и другое, когда используется Take(1)
.
public void GetEmployeesByDept(long deptId)
{
IQueryable<EmployeeDetails> empDetails = _context.EmployeeDetails.Where(x => x.Idseq == deptId);
// First DB call
var firstEmployee = empDetails.Take(1);
// Second DB call
Console.WriteLine(empDetails.GetType());
}
Это моё объяснение - но когда я завис над empDetails
, я увидел, что выражение содержит два аргумента
With the table
$x.Idseq == .Constant<TestProject.Program+<>c__DisplayClass2_0>(TestProject.Program+<>c__DisplayClass2_0).deptId
Итак, теперь, когда выполнение закончилось firstEmployee
, я находясь над переменной firstEmployee
, я мог видеть выражение, как показано ниже
Это тоже вызов БД?
.Call System.Linq.Queryable.Take(
.Call System.Linq.Queryable.Where(
.Constant<Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[Employee.Models.EmployeeDetails]>(Microsoft.EntityFrameworkCore.Query.Internal.EntityQueryable`1[Employee.Models.EmployeeDetails]),
'(.Lambda #Lambda1<System.Func`2[Employee.Models.EmployeeDetails,System.Boolean]>)),
1).Lambda #Lambda1<System.Func`2[Employee.Models.EmployeeDetails,System.Boolean]>(Employee.Models.EmployeeDetails $x)
{
$x.Idseq == .Constant<TestProject.Program+<>c__DisplayClass2_0>(TestProject.Program+<>c__DisplayClass2_0).deptId
}
Если это единственный вызов БД из двух, тогда почему я могу загрузить данные для empDetails?
Вопрос № 2 : теперь я изменил тип с IQueryable
на IEnumerable
.
Насколько я понимаю, вызов БД выполняется с помощью условия where
, который затем загружает данные в память и затем берет первый элемент.
Это правда?
public void GetEmployeesByDept(long deptId)
{
IEnumerable<EmployeeDetails> empDetails = _context.EmployeeDetails.Where(x => x.Idseq == deptId);
// First DB call
var firstEmployee = empDetails.Take(1); // in-memory object
Console.WriteLine(empDetails.GetType());
}
Может кто-нибудь поправить меня, если мое понимание неверно.
Заранее спасибо