Linq, почему разделение запроса на отдельный метод не выполняется - PullRequest
2 голосов
/ 04 июля 2019

Я знаю, что это не настоящий пример. Мы столкнулись с этим случайно, а потом удивились, почему, хотя это и неправильно, это не работает

{
    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 () удален из метода, то и метод, и эквивалентный блок выполняются без ошибок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...