Я знаю, что это не настоящий пример. Мы столкнулись с этим случайно, а потом удивились, почему, хотя это и неправильно, это не работает
{
var links =
from z in (
await (
from x in employees
// Version 1
let y = LinqFromSeparateMethod(employees).ToArray()
// Version 2
/*
let y = (from z in employees
from y in z.EmployeeAddressLink
select y).ToArray()
*/
select new
{
y,
x
}
).ToArrayAsync()
)
select(
z.y.ToArray()
);
}
private IQueryable<EmployeeAddressLink> LinqFromSeparateMethod(IQueryable<Employee> employees)
{
return from x in employees
from y in x.EmployeeAddressLink
select y;
}
Здесь мы имеем очень простую структуру базы данных: от таблицы сотрудников до таблицы ссылок сотрудников
У нас есть блок кода, который может быть встроен непосредственно в запрос linq или может быть возвращен как IQueryable из метода
Мы вызываем ToArray для блока в обоих случаях
- Если он встроен непосредственно в linq, он запускается
- Если мы используем версию метода, то получим ошибку «Вторая операция началась в этом контексте до завершения предыдущей операции»
Учитывая, что метод возвращает IQueryable, не должны ли они быть идентичными?
Просто добавьте, что если метод .ToArray () удален из метода, то и метод, и эквивалентный блок выполняются без ошибок