Subsonic vs Linq to Sql

168

Програмування Asp.net
Попередній

Наступний

Согедня постала потреба розібратися з такою 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 products = new List();
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 products = new List();
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 products = new List();
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 відобразив такі запрсы.

Тепер SubSonic. Яким чином вставлят відразу кілька записів, я так і не зрозумів, за цим код має вигляд:

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

List products = new List();
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 показував ось такі запити:

Висновок: працюють однаково.

7) Оновлення та видалення. Чекайте…..

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