Ускорение LinqDataSource - PullRequest
       37

Ускорение LinqDataSource

0 голосов
/ 04 марта 2011

Привет, у меня следующий вопрос. Предположим, где находятся две таблицы в базе данных:

Clients(
  id,
  name,
  address)

Orders(
  id,
  name,
  desc,
  datemodified,
  client_id)

Второй ссылается на первый, то есть каждый заказ присваивается клиенту. Теперь предположим, что у меня есть страница ASPX с таблицей LinqDataSource для заказов и GridView, который использует этот источник данных и отображает таблицу со следующими столбцами:

  1. Название заказа.
  2. Order desc.
  3. Имя клиента.
  4. Адрес клиента.

Насколько я понимаю, Linq to SQL спроектирован таким образом, что по умолчанию он не загружает никаких связанных сущностей, он делает это только при запросе дочернего свойства. Итак, при загрузке страницы возникает следующая ситуация:

  1. Первый запрос извлечет записи из таблицы «Заказы».
  2. Для каждой строки, отображаемой GridView, дополнительный запрос будет выполняться при запросе одного из свойств клиента.

Следовательно, если у нас есть 100 заказов, это означает, что будет выполнено 101 запрос вместо одного (или даже 201, если запрос будет выполняться для каждого свойства клиента)? Как избежать этого и заставить LinqDataSource загружать все обязательные поля одним запросом?

Прямо сейчас я вижу единственное решение этой проблемы - используйте SqlDataSource с запросом на соединение, который будет извлекать все необходимые поля сразу.

Ответы [ 2 ]

0 голосов
/ 06 марта 2011

Установить LoadOptions в событии LinqDataSource.ContextCreated

Посмотрите здесь, как это сделать http://codebetter.com/davidhayden/2007/08/06/linq-to-sql-query-tuning-for-performance-optimization/

0 голосов
/ 04 марта 2011

Вы можете переопределить событие OnSelecting источника LinqDataSource, чтобы он извлекал анонимный тип с точными данными, которые вы ищете:

protected void LinqDataSource_OnSelecting(object sender, LinqDataSourceSelectEventArgs e)
{
    DataContext dc = new DataContext();
    var query = from o in dc.Orders
                select new
                {
                    OrderName = o.name,
                    OrderDesc = o.desc,
                    ClientName = o.Client.name,
                    ClientAddress = o.Client.address
                };
    // Insert any necessary conditional statements adjustments as needed.

    e.Result = query;
}

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

...