Почему Linq К Sql, связывающему с данными к gridview намного медленнее, чем передача SQL?

Это - ответ на проблему хрупкого базового класса, которая говорит, что на вид невинные модификации к базовым классам могут иметь непреднамеренные последствия для наследников, которые зависели от предыдущего поведения. Таким образом, необходимо стараться инкапсулировать то, что Вы не хотите положенный так, чтобы производные классы повиновались контрактам, определенным базовым классом. И как только наследники существуют, необходимо быть действительно осторожны с тем, что Вы изменяете в базовом классе.

7
задан p.campbell 22 November 2009 в 17:15
поделиться

5 ответов

Linq2Sql возвращает строго типизированные объекты, тогда как набор данных заполняется тем, что по сути составляет хеш-таблицу.

В Linq заполнение данных и привязка этих данных к GridView использует много отражений для получения желаемых результатов.

Во втором фрагменте кода данные загружаются в набор данных и привязан к GridView. По сути, это загрузка хеш-таблицы с данными и поиском для привязки.

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

8
ответ дан 6 December 2019 в 10:51
поделиться

Вы смотрели на фактический SQL, отправляемый на SQL Server с помощью Profiler?

В этом случае я подозреваю, что именно то, как клиент обрабатывает его (DataSet vs List), является причиной разницы , но я далеко не эксперт по ac #.

4
ответ дан 6 December 2019 в 10:51
поделиться

Захват и анализ операторов SQL, которые отправляются по сети в вашем примере Linq To Sql. SQL Profiler сделает свое дело.

Запустите оба этих оператора из примеров 1 и 2 непосредственно на своем SQL Server с помощью Management Studio. Скорее всего, вы не увидите НИКАКОЙ существенной разницы в плане запроса.

Я думаю, что большая часть времени тратится на создание объектов C # ( Ответ Джейсона, как мне кажется, подтверждает его ).

3
ответ дан 6 December 2019 в 10:51
поделиться

Ваше измерение может быть неточным, используйте класс System.Diagnostics.StopWatch для измерения времени:

static void Main(string[] args)
{
    var sw = Stopwatch.StartNew();
    Thread.Sleep(100);
    Console.WriteLine(sw.Elapsed.ToString());
    Console.Read();
}
1
ответ дан 6 December 2019 в 10:51
поделиться

Linq to Sql должен выяснить из вашего кода, какой тип запроса запускать к базе данных, после чего он должен преобразовать результаты запроса в строго типизированные объекты, что означает, что произойдет преобразование. Это две вещи, которых ваша версия DataSet не выполняет.

Если вас интересует производительность Linq to Sql, есть возможность использовать скомпилированные запросы , что устраняет необходимость интерпретации во время выполнения.

]
2
ответ дан 6 December 2019 в 10:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: