Вы можете переопределить функцию, используя трюк LD_PRELOAD
- см. man ld.so
. Вы компилируете shared lib с помощью своей функции и запускаете двоичный файл (вам даже не нужно изменять двоичный файл!), Например LD_PRELOAD=mylib.so myprog
.
В теле вашей функции (в общей папке) вы пишете как this:
const char *getObjectName (object *anObject) {
static char * (*func)();
if(!func)
func = (char *(*)()) dlsym(RTLD_NEXT, "getObjectName");
printf("Overridden!\n");
return(func(anObject)); // call original function
}
Вы можете переопределить любую функцию из общей библиотеки, даже из stdlib, без изменения / перекомпиляции программы, чтобы вы могли сделать трюк в программах, для которых у вас нет источника. Разве это не приятно?
Во-первых, если вы начинаете новый проект, используйте Entity Framework («EF») - теперь он генерирует гораздо лучший SQL (больше похожий на Linq to SQL), его легче поддерживать, и он более мощный, чем Linq to SQL ("L2S"). На момент выпуска .NET 4.0 я считаю Linq to SQL устаревшей технологией. MS открыто заявляла о том, что не будет продолжать разработку L2S.
1) Производительность
На этот вопрос сложно ответить. Для большинства операций с одним объектом ( CRUD ) вы найдете примерно эквивалентную производительность со всеми тремя технологиями. Вы должны знать, как работают EF и Linq to SQL, чтобы использовать их в полной мере. Для операций большого объема, таких как опросные запросы, вы можете захотеть, чтобы EF / L2S «скомпилировал» ваш запрос сущности, чтобы инфраструктуре не приходилось постоянно регенерировать SQL, или вы можете столкнуться с проблемами масштабируемости. (см. правки)
Для массовых обновлений, когда вы обновляете большие объемы данных, необработанный SQL или хранимая процедура всегда будет работать лучше, чем решение ORM, потому что вам не нужно маршалировать данные по сети в ORM для выполнения обновлений.
2) Скорость разработки
В большинстве сценариев EF вытесняет «голые» SQL / хранимые процессы, когда дело касается скорости разработки.Конструктор EF может обновлять вашу модель из вашей базы данных по мере ее изменения (по запросу), поэтому вы не столкнетесь с проблемами синхронизации между вашим объектным кодом и кодом базы данных. Единственный случай, когда я бы не стал рассматривать использование ORM, - это когда вы делаете приложение типа отчетов / панели мониторинга, в котором вы не выполняете никаких обновлений, или когда вы создаете приложение только для выполнения операций по обслуживанию необработанных данных в базе данных.
3) Аккуратный / поддерживаемый код
Безусловно, EF превосходит SQL / sprocs. Поскольку ваши отношения моделируются, соединения в вашем коде относительно нечасты. Взаимосвязь сущностей почти очевидна для читателя по большинству запросов. Нет ничего хуже, чем переходить от уровня к уровню отладки или через несколько уровней SQL / среднего уровня, чтобы понять, что на самом деле происходит с вашими данными. EF очень эффективно вносит вашу модель данных в ваш код.
4) Гибкость
Сохраненные процедуры и необработанный SQL более «гибкие». Вы можете использовать sprocs и SQL для создания более быстрых запросов для нечетных конкретных случаев, и вы можете использовать собственные функции БД проще, чем с ORM.
5) В целом
Не попадайтесь в ловушку ложной дихотомии выбора ORM и использования хранимых процедур. Вы можете использовать и то, и другое в одном приложении, и, вероятно, вам следует это сделать. Большие массовые операции должны выполняться в хранимых процедурах или SQL (которые фактически могут вызываться EF), а EF следует использовать для ваших операций CRUD и большинства потребностей вашего среднего уровня. Возможно, вы захотите использовать SQL для написания отчетов.Думаю, мораль этой истории такая же, как и всегда. Используйте подходящий инструмент для работы. Но, что самое худое, EF в настоящее время очень хорош (начиная с .NET 4.0). Потратьте немного времени на чтение и глубокое понимание этого, и вы с легкостью сможете создавать потрясающие высокопроизводительные приложения.
РЕДАКТИРОВАТЬ : EF 5 немного упрощает эту часть с помощью автоматически скомпилированных запросов LINQ , но для действительно больших объемов данных вам обязательно нужно протестировать и проанализировать, что лучше всего подходит для вас. реальный мир.
ваш вопрос в основном состоит в том, чтобы O / RM или SQL вручную писали
Использование ORM или простого SQL?
Взгляните на некоторые другие решения O / RM, L2S не единственное (NHibernate, ActiveRecord)
http://en.wikipedia.org/wiki/List_of_object-relational_mapping_software
для ответа на конкретные вопросы:
Хранимые процедуры:
(+)
(-)
ORM:
(+)
(-)
Общий компромисс заключается между большой гибкостью и потерей большого количества времени по сравнению с ограничениями в том, что вы можете делать, но сделать это очень быстро.
На этот вопрос нет общего ответа. Это вопрос священных войн. Также зависит от проекта и ваших потребностей. Выберите то, что лучше всего подходит для вас.
LINQ-to-SQL - замечательная технология, которая очень проста в использовании и в целом генерирует очень хорошие запросы к серверной части. Планировалось, что LINQ-to-EF вытеснит его, но исторически было крайне неудобно использовать и генерировал гораздо худший SQL. Я не знаю текущего положения дел, но Microsoft пообещала перенести все достоинства L2S в L2EF, так что, может быть, сейчас все лучше.
Лично мне очень не нравятся инструменты ORM (подробности см. В моей диатрибе здесь ), поэтому я не вижу причин отдавать предпочтение L2EF, поскольку L2S дает мне все, что я когда-либо ожидал от уровень доступа к данным. Фактически, я даже думаю, что функции L2S, такие как созданные вручную сопоставления и моделирование наследования, добавляют совершенно ненужную сложность. Но это только я. ; -)