Поскольку вы используете .ToList()
EF
- Извлечение всех клиентов из базы данных
- Сопоставление их с объектами клиентов
- Позже, когда вы вычислите
GetOneColumn
, вы делаете проекцию на них (итерируя по уже материализованному списку объектов)
Чтобы извлечь только один столбец,
- Удалите
.ToList()
из хранилища. и верните IQueryable<Customers>
- Позвоните
.ToList()
после вашего выбора var GetOneColumn = myContext.CustomerRepository.GetAllCustomers().Select(f=>f.FullName).ToList();
Итак, ваш код будет
public IQueryable<customers> GetAllCustomers()
{
return myContext.customers;
}
// later in code
var GetOneColumn = myContext.CustomerRepository.GetAllCustomers().Select(f=>f.FullName).ToList();
Посмотрите, что происходит для себя! Разбейте ваш код на шаги и debug :
var allCustomers = myContext.CustomerRepository.GetAllCustomers();
var allCustomerNames = allCustomers.Select(f=>f.FullName);
В качестве альтернативы, запустите профилировщик в вашей БД или включите ведение журнала запросов в EF
Чтобы увидеть все запросы, которые генерирует EF, вы можете сделать что-то вроде этого
using (var context = new BlogContext())
{
context.Database.Log = Console.Write;
// Your code here...
}
Подробнее см. в документах и запросах журнала, выполняемых Entity Framework DbContext
Если вы прочитали это далеко, то стоит знать, что на самом деле заставит EF отправлять запрос - см. Как работают запросы
По сути, это происходит всякий раз, когда вы начинаете перечислять элементы IQueryable<T>
(включая методы LINQ, такие как First()
, Last()
, Single()
, ToList()
, ToArray()
и т. п.)