Итерация по запросу linq to sql очень медленная - PullRequest
1 голос
/ 16 июня 2010

У меня есть представление AdvertView в моей базе данных, это простое соединение между некоторыми таблицами (реклама, клиент, свойства).Затем у меня есть простой запрос linq для получения всех объявлений для клиента:

public IEnumerable<AdvertView> GetAdvertForCustomerID(int customerID)
{
    var advertList = 
        from advert in _dbContext.AdvertViews
        where advert.Customer_ID.Equals(customerID)
        select advert;
    return advertList;
}

Затем я хочу сопоставить это с modelItems для моего приложения MVC:

public List<AdvertModelItem> GetAdvertsByCustomer(int customerId)
{
    List<AdvertModelItem> lstAdverts = new List<AdvertModelItem>();
    List<AdvertView> adViews = _dataHandler.GetAdvertForCustomerID(customerId).ToList();
    foreach(AdvertView adView in adViews)
    {
        lstAdverts.Add(_advertMapper.MapToModelClass(adView));
    }
    return lstAdverts;
}

Я ожидалесть некоторые проблемы с производительностью SQL, но проблема, похоже, связана с функцией .ToList ().Я использую профилировщик производительности ANTS, и он сообщает, что общее время выполнения функции составляет 1,400 мс, и 850 из них с ToList ().Итак, мой вопрос: почему функция tolist занимает так много времени здесь?

Ответы [ 2 ]

3 голосов
/ 16 июня 2010

GetAdvertForCustomerID не возвращает результаты, он возвращает запрос.

ToList перечисляет запрос.Результаты увлажняются в этот момент.Отключение базы данных происходит в вызове ToList.

Вы должны получить сгенерированный sql (используя свойство SqlProfiler или DataContext.Log) и передать его в анализатор запросов для проверки плана выполнения и ввода-вывода (SETСТАТИСТИКА IO ON).

1 голос
/ 16 июня 2010

.ToList выполнит запрос, включая полную передачу данных в базу данных, получение данных и материализацию объектов сущностей для каждой возвращаемой записи ... ... вы, скорее всего, тратите большую часть этого времени, дБ со стороны, так что внимательно посмотрите на план выполнения для вашего представления.

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