Почему предложение let с предложениемwhere не может быть переведено в SQL?C#

Место общения программистов C#
Anonymous
Почему предложение let с предложениемwhere не может быть переведено в SQL?

Сообщение Anonymous »

У меня есть фрагмент кода, в котором используется let с предложениемwhere.

Код: Выделить всё

private List Example2()
{
var query1 =
from c in _context.Customers
let custPurchases = _context.Purchases.Where(p => p.CustomerId == c.Id)
where custPurchases.Any(x => x.Price > 500)
select c.Name;

return query1.ToList();
}
Компилируется хорошо, но во время выполнения получаю такую ​​ошибку:

System.InvalidOperationException: запрос содержит проекцию 'c => DbSet()
.Where(p => p.CustomerId == c.Id)' типа 'IQueryable'. Коллекции в окончательной проекции должны иметь тип IEnumerable, например List. Рассмотрите возможность использования ToList или другого механизма для преобразования IQueryable или IOrderedEnumerable в IEnumerable.

Почему EF Core пытается выполнить этот код на стороне клиента, а не на сервере (базе данных)? Где EF Core сталкивается с проблемой во время трансляции IQueryable в SQL?
P.S.
LINQPad 8 по умолчанию легко выполняет этот код, но это LINQ-to-SQL:
Изображение

Может быть, вы можете предоставить некоторую литературу или ссылки, чтобы глубже изучить мир дерева выражений?

Я использую поставщика SQL Server в LinqPad.
Строка подключения: «Data Source=.;Integrated Security=SSPI;TrustServerCertificate=true;app=LINQPad».

Подробнее здесь: https://stackoverflow.com/questions/797 ... ate-to-sql

Вернуться в «C#»