Subsonic vs Linq to Sql

Programming
Предыдущий Следующий

Subsonic   Согедня постала потребность разобраться с такой ORM как Subsonic. До этого я использовал LinqToSQL и был доволен. Когда то я сравнивал Linq  с другими способами работы с БД.  Тогда мой выбор упал на Linq To SQL и я не ошибся.

   Сейчас для проверки я буду использовать стандартное ASP.Net Mvc приложение и базу данных Northwind. Работать я буду из SubSonic 3.0.0.4, на данный момент это последняя версия. Итак...

1) Всем известно, что LinqToSQL может работать только с базами данных от Microsoft, хотя они и обещают расширят свой арсенал, но сейчас это так. Subsonic такого ограничения нету. По правде говоря, даже не знаю на сколько это можно считать плюсом, по скольку я и так использую MSSQL.

2) Следующий более важны показатель это информация в интернете. По Linq ее значительно больше. И сама компания Microsoft будет пропагандировать свой продукт.

3) Теперь более технические дела (размер). Для работы из SubSonic в проект нужно добавит dll - SubSonic.Core.dll размер которой 280 КБ. В Linq библиотеку  System.Data.Linq.dll добавлять не нужно она входит в Framework 3.5. Файлы с кодом (повторюсь БД - Northwind), которые генерит SubSonic  занимают 368 КБ, у Linq они весят - 140 КБ. DLL файл проекта после этого увеличивается с 20,0 КБ до 160 КБ, если юзать SubSonic, и до 72,0 КБ если использовать LINQ. Этот параметр, как по мне, не значительно влияет на работу с ORM.

4) Удобство. Что в Linq и что в SubSonic классы для работы с БД создаются методом DragAndDrop. В LinqToSQL нужно из окна Server Explorer перенести данные (таблицы и хранимые процедуры) в файл *.dbml  и вам отобразиться архитектура базы (таблицы и связи). В то время как в SubSonic нужно в папку Model добавить файлы (ActiveRecord.tt Context.tt StoredProcedures.tt Structs.tt), которые и сгенерируют классы, архитектура БД наглядно не отображается. Если в ходе работы нужно изменить структуру одной из таблиц, то в Linq можно визуально изменять только ее, не касаясь при этом других. А вот как это делать в SubSonic  я не понял, нужно либо вручную править код, либо заново генерировать код. Вообщем в этом параметре LINQ to SQL лучше.

5) Скорость выборки. Будем работать из таблицею Products. Я внес в нее побольше данных, что бы считываение не было таким быстрым.  Дл нала создаем объекты для работы с БД.

NorthwindDB dbSubSonic  = new NorthwindDB();  //SubSonic
NorthwindDataContext dbLINQ = new NorthwindDataContext(); //LINQ

Код считывания LINQ, прошу обратить внимания цикл бежит 200 раз

==================== LINQ ========================

List<Product> products = new List<Product>();
DateTime dtStart = DateTime.Now;
for (int i = 0; i < 200; i++)
{
     products.AddRange(dbLINQ.Products.ToList());
}
var time = DateTime.Now - dtStart;

=================================================

Было считано 135400 записей (классов Product) за 3,1366667 секунды

Теперь код для SubSonic, прошу обратить внимания цикл бежит 20 раз

=================== Subsonic =======================

List<Product> products = new List<Product>();
DateTime dtStart = DateTime.Now;
for (int i = 0; i < 20; i++)
{
    products.AddRange(dbSubSonic.Products.ToList());
}
var time = DateTime.Now - dtStart;

=================================================

Было считано 13540 записей (классов Product) за 24,261 секунды. Ужастный результат.

Если изменить код   products.AddRange(Product.All().ToList());   , то результат становиться только хуже 25.231 секунды.

Вывод: однозначно LINQ

6) Запись. Проверяем работу Insert команды. Начнем с Linq to SQL, вот код:

==================== LINQ ========================

List<Product> products = new List<Product>();
DateTime dtStart = DateTime.Now;
 for (int i = 0; i < 100; i++)
{
    products.Add(new Product()
    {
       ProductName = i.ToString() + "producLinq",
     });
}
dbLINQ.Products.InsertAllOnSubmit(products);
dbLINQ.SubmitChanges();
var time = DateTime.Now - dtStart;

=================================================

Код выполнлся 02.3730000 секунды, SQL Profiler отобразил такие запрсы.

insert linq

Тепер SubSonic. Каким образом вставлят сразу несколько записей, я так и не понял, по этому код имеет вид:

=================== Subsonic =======================

List<Product> products = new List<Product>();
DateTime dtStart = DateTime.Now;
for (int i = 0; i < 100; i++)
{
      new Product()
      {
           ProductName = i.ToString() + "producSubSonic",
      }.Add();
}
var time = DateTime.Now - dtStart;

=================================================

Меня удивила скорость работы - 2.411 секунды, такая же как и в LINQ, SQL Profiler  показывал вот такие запросы:

insert Subsonic

Вывод: работают одинаково.

7) Обновление и удаление.  Ожидайте.....

Вывод. На данный момент мой выбор Linq to Sql, как-то Microsoft больше внушает доверия, нежели сторонние разработчики, которые могут заморозить свой проект и на этом все.

Самостоятельный отпуск Опыт заказа вывоза мусора в Киеве Магія зміни: Від ночі до дня
Магія Вечірнього Неба: Відлякуйте втомленість дня і зануртеся у світ загадок і краси