Почему предложение 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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