Приоритет при извлечении данных из базы данных mysql и фильтрации полученных данных - PullRequest
1 голос
/ 01 апреля 2020

Я хочу получить только один столбец из моей базы данных. Следующий код действительно работает:

Это мой клиент в mysql -table / model-in-EF6

 public partial class customers
    {
        public customers()
        public int CustomerID { get; set; }
        public string FullName { get; set; }
        public string Mobile { get; set; }
        public string Email { get; set; }
        public string Address { get; set; }
        public string Image { get; set; }
    }
public List<customers> GetAllCustomers()
        {
            return myContext.customers.ToList();
        }

Это мой вопрос:

var GetOneColumn = myContext.CustomerRepository.GetAllCustomers().Select(f=>f.FullName);

Получает ли он все столбцы от клиентов в базе данных, а затем выбирает только один столбец (FullName) из полученных данных или нет, он извлекает только один столбец (FullName) из базы данных? Если он извлекает все данные из базы данных, что является правильным кодом (Linq)?

Как я могу найти это ??

1 Ответ

2 голосов
/ 01 апреля 2020

Поскольку вы используете .ToList() EF

  1. Извлечение всех клиентов из базы данных
  2. Сопоставление их с объектами клиентов
  3. Позже, когда вы вычислите GetOneColumn, вы делаете проекцию на них (итерируя по уже материализованному списку объектов)

Чтобы извлечь только один столбец,

  1. Удалите .ToList() из хранилища. и верните IQueryable<Customers>
  2. Позвоните .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() и т. п.)

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