Это - ответ на проблему хрупкого базового класса, которая говорит, что на вид невинные модификации к базовым классам могут иметь непреднамеренные последствия для наследников, которые зависели от предыдущего поведения. Таким образом, необходимо стараться инкапсулировать то, что Вы не хотите положенный так, чтобы производные классы повиновались контрактам, определенным базовым классом. И как только наследники существуют, необходимо быть действительно осторожны с тем, что Вы изменяете в базовом классе.
Linq2Sql возвращает строго типизированные объекты, тогда как набор данных заполняется тем, что по сути составляет хеш-таблицу.
В Linq заполнение данных и привязка этих данных к GridView использует много отражений для получения желаемых результатов.
Во втором фрагменте кода данные загружаются в набор данных и привязан к GridView. По сути, это загрузка хеш-таблицы с данными и поиском для привязки.
Операции с хеш-таблицами всегда будут быстрее, чем отражение. При небольшом количестве данных заметной разницы не будет, но для большого количества данных вы увидите влияние отражения в Linq.
Вы смотрели на фактический SQL, отправляемый на SQL Server с помощью Profiler?
В этом случае я подозреваю, что именно то, как клиент обрабатывает его (DataSet vs List), является причиной разницы , но я далеко не эксперт по ac #.
Захват и анализ операторов SQL, которые отправляются по сети в вашем примере Linq To Sql. SQL Profiler сделает свое дело.
Запустите оба этих оператора из примеров 1 и 2 непосредственно на своем SQL Server с помощью Management Studio. Скорее всего, вы не увидите НИКАКОЙ существенной разницы в плане запроса.
Я думаю, что большая часть времени тратится на создание объектов C # ( Ответ Джейсона, как мне кажется, подтверждает его ).
Ваше измерение может быть неточным, используйте класс System.Diagnostics.StopWatch для измерения времени:
static void Main(string[] args)
{
var sw = Stopwatch.StartNew();
Thread.Sleep(100);
Console.WriteLine(sw.Elapsed.ToString());
Console.Read();
}
Linq to Sql должен выяснить из вашего кода, какой тип запроса запускать к базе данных, после чего он должен преобразовать результаты запроса в строго типизированные объекты, что означает, что произойдет преобразование. Это две вещи, которых ваша версия DataSet не выполняет.
Если вас интересует производительность Linq to Sql, есть возможность использовать скомпилированные запросы , что устраняет необходимость интерпретации во время выполнения.
]