Re[26]: LINQ vs Store Procedure
От: Lloyd Россия  
Дата: 20.03.09 16:13
Оценка:
Здравствуйте, Sinix, Вы писали:

S>А киньте плиз пруфлинкой про поддерживание disconnected entities, потому как Бен-Ами придерживается другого мнения: (http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/172ae667-d20a-4dbf-9e98-39b90387b4f4/).


S>Там же — про проблемы с биндингом.


S>OakLeaf тоже не верит в disconnected EF: http://oakleafblog.blogspot.com/2008/11/entity-framework-team-abandons-unified.html.


У ObjectContext-а же есть detach. Или речь о чем-то другом?
Re[13]: LINQ vs Store Procedure
От: Lloyd Россия  
Дата: 20.03.09 16:15
Оценка:
Здравствуйте, Tom, Вы писали:

L>>Нет, этот вариант хуже линка, уверяю вас. Маппинг придется реализовывать в ручную. Хотя кому-то это очень нравится (DuШes).

Tom>Я предпологал, что тул так же генерирует набор классов, на которые мапятся вызовы стор. Или у вас это не так?

Классы генерятся, если процедура возвращает 1 рекордсет. Если больше одного, надо самостоятельно указывать тип.
Re[27]: LINQ vs Store Procedure
От: DuШes  
Дата: 20.03.09 16:16
Оценка:
Здравствуйте, Lloyd, Вы писали:

[...]

L>Объявляешь вот такой метод:

L>
L>[Function(Name = "dbo.CustOrderHistTwice")]
L>[ResultType(typeof(CustOrderHistResultEntry))]
L>public IMultipleResults CustOrderHistTwice([Parameter(Name = "CustomerID", DbType = "NChar(5)")] string customerID)
L>{
L>    IExecuteResult result = ExecuteMethodCall(this, (MethodInfo)MethodInfo.GetCurrentMethod(), customerID);
L>    return (IMultipleResults)result.ReturnValue;
L>}
L>

L>Здесь процедура CustOrderHistTwice возвращает 2 резалтсета.

L>Использовать во так:


L>
L>DataClasses1DataContext ctx = new DataClasses1DataContext();
L>var result = ctx.CustOrderHistTwice("CACTU");
L>foreach (var hist in result.GetResult<CustOrderHistResultEntry>())
L>{
L>    Console.WriteLine(new { hist.ProductName, hist.Total });
L>}
L>Console.WriteLine("==============");
L>foreach (var hist in result.GetResult<CustOrderHistResultEntry>())
L>{
L>    Console.WriteLine(new { hist.ProductName, hist.Total });
L>}
L>

L>И все.

L>Как видишь, никакой магии и правки руками. Только стандартный функционал.


давайте наверно уже закончим я понял что вы имеет ввиду, магия здесь в классах CustOrderHistResultEntry и в поддержке такиго рода в синхронном состоянии
Re[28]: LINQ vs Store Procedure
От: Lloyd Россия  
Дата: 20.03.09 16:24
Оценка:
Здравствуйте, DuШes, Вы писали:

L>>Как видишь, никакой магии и правки руками. Только стандартный функционал.


DШ>давайте наверно уже закончим


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

DШ>я понял что вы имеет ввиду, магия здесь в классах CustOrderHistResultEntry и в поддержке такиго рода в синхронном состоянии


Опишите свой вариант. Как вы поддерживаете синхронность кроме как руками? Я вариантов вообще не вижу. Более того, у меня есть подозрение, что это нельзя сделать атоматически всилу того, что sqlserver не возвращает схему резалтсетов, следующих за первым. Хотя по этому поводу я не на 100% уверен.
Re[9]: LINQ vs Store Procedure
От: IB Австрия http://rsdn.ru
Дата: 20.03.09 16:34
Оценка: +1
Здравствуйте, asd123, Вы писали:

A>Надеюсь, вы пошутили

Конечно нет.
Мы уже победили, просто это еще не так заметно...
Re[9]: LINQ vs Store Procedure
От: IB Австрия http://rsdn.ru
Дата: 20.03.09 16:36
Оценка:
Здравствуйте, kenzo_u, Вы писали:

_>Почему фиолетово для квалифицированного разработчика и почему только хранимки для стажеров?

Потому что у опытного разработчика DAL будет в любом случае, а стажеру надо учиться запросы отделять, да и руку набивать в работе с базой. А то потом появляются разработчики, которые БД боятся как огня, не знают что с ней делать и только мифы всякие распространяют.. =)
Мы уже победили, просто это еще не так заметно...
Re[25]: LINQ vs Store Procedure
От: Lloyd Россия  
Дата: 20.03.09 16:48
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Сорри, что вмешиваюсь, но получение схемы результсета хранимой процедуры — вполне выполнимая операция. Скажем, дадасет дизайне такое умеет.


Значит ошибался. А где можно посмотреть как оно работает?
Re[10]: LINQ vs Store Procedure
От: asd123  
Дата: 20.03.09 16:53
Оценка:
Здравствуйте, IB, Вы писали:

IB>Здравствуйте, asd123, Вы писали:


A>>Надеюсь, вы пошутили

IB>Конечно нет.

Прочитав Ваш ответ на вопрос kenzo_u понял что Вы имели в виду. Изначальная формулировка как-то смутила просто
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[14]: LINQ vs Store Procedure
От: Tom Россия http://www.RSDN.ru
Дата: 20.03.09 17:19
Оценка:
L>Классы генерятся, если процедура возвращает 1 рекордсет. Если больше одного, надо самостоятельно указывать тип.
А больше одного и нафик не нужно обычно.
Народная мудрось
всем все никому ничего(с).
Re[26]: LINQ vs Store Procedure
От: Tom Россия http://www.RSDN.ru
Дата: 20.03.09 17:21
Оценка:
L>Значит ошибался. А где можно посмотреть как оно работает?
Ага, интересно особенно как оно будет работать если мы вдруг ему подсунем стору которая возвращает разные наборы при разных входных параметрах.
Народная мудрось
всем все никому ничего(с).
Re[15]: LINQ vs Store Procedure
От: Lloyd Россия  
Дата: 20.03.09 17:57
Оценка:
Здравствуйте, Tom, Вы писали:

L>>Классы генерятся, если процедура возвращает 1 рекордсет. Если больше одного, надо самостоятельно указывать тип.

Tom>А больше одного и нафик не нужно обычно.
У всех разные сценарии.
Re[27]: LINQ vs Store Procedure
От: Spender Канада http://rybkov.livejournal.com
Дата: 20.03.09 17:58
Оценка:
[крик души]

Нафига все это нужно?!?! Если для того, чтобы получить 1 запись из базы вынимаются все!!! и потом из них уже возвращается одна. Либо я чего-то не понимаю. Ведь быстрее вытащить только то, что нам надо, чем потом искать?!?!
Re[29]: LINQ vs Store Procedure
От: DuШes  
Дата: 20.03.09 20:24
Оценка:
Здравствуйте, Lloyd, Вы писали:

L>Здравствуйте, DuШes, Вы писали:


L>>>Как видишь, никакой магии и правки руками. Только стандартный функционал.


DШ>>давайте наверно уже закончим


L>давайте для начала вы ответите на вопросы, которые вам были заданы. проявляйте уважение к собеседнику.

да о чем вы говорите, вы сами давно уже прекратили здесь http://rsdn.ru/forum/message/3335827.1.aspx
Автор: Lloyd
Дата: 20.03.09
, ну может на разных языках говорим

насчет ваших вопросов:
L>Так вот, что вы имели в виду. Вы оказывается, dbml называете кодом, а автоматической генерацией называете процедуру перетаскивания всех таблиц в дизайнер или то, что получается при первоначальном создании dbml-я по базе. Я вас правильно понял?
dbml — да, именно тот код, а вы что подразумевали под классами-врапперами, о которых я уже устал писать ...

L>Теперь что по поводу "реализовывать трекинг вручную"?

насчет трекинга вручную, в вашем примере:
L>
L>DataClasses1DataContext ctx = new DataClasses1DataContext();
L>var result = ctx.CustOrderHistTwice("CACTU");
L>foreach (var hist in result.GetResult<CustOrderHistResultEntry>())
L>{
L>    Console.WriteLine(new { hist.ProductName, hist.Total });
L>}
L>Console.WriteLine("==============");
L>foreach (var hist in result.GetResult<CustOrderHistResultEntry>())
L>{
L>    Console.WriteLine(new { hist.ProductName, hist.Total });
L>}
L>

L>И все.

это не все, если уж быть до конца честным, давайте рассмотрим еще и классы врапперы CustOrderHistResultEntry...хорошо если процедура состоит из банального select и дизайнер сумеет таки сгенерить вам класс, хотя, как вы сами здесь и утверждаете
S>Сорри, что вмешиваюсь, но получение схемы результсета хранимой процедуры — вполне выполнимая операция. Скажем, дадасет дизайне такое умеет.
L>Значит ошибался. А где можно посмотреть как оно работает?
класс-врапперы вы не генерите, а пишите сами, это и есть вручную или я ошибаюсь?

Вообще, при более-менее сложной логике сигнатура возвращаемых данных может быть гораздо сложнее, это и преобразования типа, и вычисляемые поля, и вложенные select для конкретного поля из записи рекордсета...и тут уже приходится писать такие классы вручную, что собственно и приводит к необходимости написания "трекинга" кода именно вручную...

Возвращаясь (просто уж о наболевшем в конктексте использования процедур в linqtosql):
L>Как видишь, никакой магии и правки руками. Только стандартный функционал.
такой же "стандартный" функционал есть классическое использование datareader|dataset, и в данном конкретном случае необходимости в линке вообще не вижу


DШ>>я понял что вы имеет ввиду, магия здесь в классах CustOrderHistResultEntry и в поддержке такиго рода в синхронном состоянии

L>Опишите свой вариант. Как вы поддерживаете синхронность кроме как руками? Я вариантов вообще не вижу. Более того, у меня есть подозрение, что это нельзя сделать атоматически всилу того, что sqlserver не возвращает схему резалтсетов, следующих за первым. Хотя по этому поводу я не на 100% уверен.

да здесь я не спорю, я как раз и утверждаю, что такого рода синхронность добиться сделать ну практически нереально...точнее, можно сделать, но просто лишив программиста вообще такого слоя как структура базы данных, тем самым просто придя к понятию объектных хранилиш, где за основу берется интерфейс самого класса, а не структура таблиц и сигнатур процедур, чтото вроде db4o
Re[30]: LINQ vs Store Procedure
От: Lloyd Россия  
Дата: 20.03.09 21:02
Оценка:
Здравствуйте, DuШes, Вы писали:

Пожалуйста, если пишешь ответ, пиши его в ту ветку, к которой он относится. Невозможно же читать.
Re: LINQ vs Store Procedure
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.03.09 21:08
Оценка:
Здравствуйте, Spender, Вы писали:

S>На самом деле ли LINQ к Store Procedure сможет улучшить производительность системы?


Нет это чушь.

SP могут увеличить производительность только за счет того, что можно будет множество запросов выполнить не покидая процесса сиквила. Что же касается компиляции запросов, то как раз linq тут вне конкуренции. Он порождает параметризованные запросы которые отлично компилируются и используются повторно. Более того, linq может оказаться предпочтительнее в случае сложных изменяемых многопараметрических запросов, так как он порождает конечный набор параметризованных запросов которые отлично кэшируются. Реализовать тоже самое в рамках хранимых процедур будет значительно сложнее.

Так что ваш начальник просто не владеет информацией и делает поспешные выводы. Я бы на его месте покурил бы статьи посвященные оптимизации многопараметрических запросов и произвел бы тесты.

Что касается оптимизации межпроцессного взаимодействия, то тут могут помочь хранимки написанные на дотнете (если конечно сервером выступает MS SQL). В них можно применять linq и они выполняются в рамках процесса сиквела.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: LINQ vs Store Procedure
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.03.09 21:10
Оценка: 9 (1)
Здравствуйте, TK, Вы писали:

TK>Плюс хранимой процедуры в том, что ее можно "оптимизировать" не трогая оригинальное приложение. в остальном, современные SQL сервера умеют кешировать планы выполнения запросов.


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

Что касается оптимизации, то у MS SQL 2008 в этом плане есть существенные улучшения, так что и для отдельных запросов можно добиться хороших результатов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[28]: LINQ vs Store Procedure
От: Lloyd Россия  
Дата: 20.03.09 21:15
Оценка:
Здравствуйте, Spender, Вы писали:

S>[крик души]


S>Нафига все это нужно?!?! Если для того, чтобы получить 1 запись из базы вынимаются все!!! и потом из них уже возвращается одна. Либо я чего-то не понимаю. Ведь быстрее вытащить только то, что нам надо, чем потом искать?!?!


Мне кажется, вы не совсем правильно поняли, что имелось в виду.
Например, у вас есть хранимая процедура GetOrder. Она принимает сл. параметры: @OrderID, @WithOrderLines, @WithDeliveryHistory.
Соответственно, когда вы запустили ее вот так:
EXEC GetOrder @OrderID = 1001, @WithOrderLines = 1, @WithDeliveryHistory = 0

, то она вернет два рекордсета: 1) "шапка" заказа 2) строчки заказа.

Усди же она была запущена с другими параметрами:
EXEC GetOrder @OrderID = 1001, @WithOrderLines = 0, @WithDeliveryHistory = 1

, то она тоже вернет два рекордсета: 1) "шапка" заказа 2) строчки истории доставки. Но в этом случае второй рекордсет будет уже другим (его колонки могут отличаться).

Как получить схему резалтсета такой процедуры лично мне совсем не понятно. Единственный вариант, который я вижу — это самостоятельно это разруливать руками.
Re[5]: LINQ vs Store Procedure
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.03.09 21:15
Оценка:
Здравствуйте, Tom, Вы писали:

TK>>Почитайте тут: http://msdn.microsoft.com/ru-ru/library/ms181055.aspx

TK>>В остальном, надо исходить из того, что SQL Server хранит только исходный код хранимых процедур и триггеров. При выполнении хранимой процедуры или триггера в первый раз исходный код компилируется в план выполнения. т.е. разница только в том, где будет хранится "текст" запросов. в случае с хранимыми процедурами (особенно если их тысячи) вы "усложняете" себе поддержку вашего решения.

Tom>А в чём усложнение?


А замена проверяемого во время компиляции, поддающегося рефакторингу и хранимого в системе контроля версий кода на код хранимый в БД, проверяемый только во время интерпретации и плохо поддающийся рефаторингу — это не усложнение?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[29]: LINQ vs Store Procedure
От: Spender Канада http://rybkov.livejournal.com
Дата: 20.03.09 21:19
Оценка:
Здравствуйте, Lloyd, Вы писали:

S>>[крик души]


L>Мне кажется, вы не совсем правильно поняли, что имелось в виду.


Все что Вы написали, я понимаю. Это же был крик души на то, что я увидел в коде системы. Для получения одной записи вытаскиваются все из БД, а потом уже полученный результат преобразуется в List<T> и там ищется по параметрам.
Re[7]: LINQ vs Store Procedure
От: VladD2 Российская Империя www.nemerle.org
Дата: 20.03.09 21:20
Оценка:
Здравствуйте, Spender, Вы писали:

S>Вот сейчас коллегам разослал. Сидят, что-то обсуждают. Смеются. Я по-китайски не очень


Я плякаль...
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.