Запрашивать SQL Server динамически

#c# #.net #sql #sql-server #generics

#c# #.net #sql #sql-сервер #общие сведения

Вопрос:

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

Я довольно новичок в концепции generics и все еще программист-любитель, но я провел некоторый поиск и попытался найти решение. Проблема на самом деле не в динамическом построении строки запроса. Я в порядке с объединением строковых литералов и переменных, мне действительно не нужно ничего более сложного. Более серьезная проблема для меня заключается в том, что при создании этого запроса я получаю обратно данные и динамическим образом присваиваю их правильным переменным.

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

 public void QueryDatabase<T>(ref List<T> Entitylist, List<string> Columns, string query) where T: Defect, new()
  

Это не идеально, но вы поняли идею. Не все в дефектах, тестовых примерах и тестовых запусках одинаковы, но я ищу способ динамически присваивать извлеченные столбцы его «правильной» переменной.

Если требуется дополнительная информация, я могу ее предоставить.

Комментарии:

1. Какую версию .NET вы используете?

Ответ №1:

Вы заново изобретаете колесо. Используйте ORM, например Entity Framework или NHibernate. Вы обнаружите, что он намного более гибкий, и подобные инструменты будут продолжать развиваться с течением времени, добавляя новые функции и повышая производительность, в то время как вы сможете сосредоточиться на более важных вещах.

РЕДАКТИРОВАТЬ:
Хотя я думаю, что в целом важно научиться использовать инструменты для чего-то подобного (лично я фанат Entity Framework и успешно использовал его в нескольких проектах сейчас, а до этого использовал LINQ to SQL), это все равно может быть ценным в качестве учебного упражнения, чтобы понять, как это сделать. ORM, с которыми у меня есть опыт, используют XML для определения модели данных и используют генерацию кода в файле XML для создания модели класса. LINQ to SQL использует пользовательские атрибуты в классах, сгенерированных в коде, для определения исходной таблицы и столбцов для каждого класса и свойства, а также отражение во время выполнения для сопоставления данных, возвращаемых из SqlDataReader , со свойствами вашего объекта класса. Entity Framework может вести себя по-разному в зависимости от используемой вами версии, используете ли вы шаблоны «по умолчанию» или «POCO», но в конечном итоге делает в основном то же самое (используя отражение для сопоставления результатов базы данных со свойствами вашего класса), он просто может использовать или не использовать пользовательские атрибуты для определения сопоставления. Я предполагаю, что NHibernate делает это таким же образом.

Комментарии:

1. Извините, я новичок в большинстве этих технологий, но, спасибо, я изучу то, что вы упомянули, дальше.

Ответ №2:

Вы изобретаете велосипед заново, да, это правда. Вам лучше всего использовать объектно-реляционный картограф, готовый к использованию «с полки». Но я думаю, вы также заслуживаете ответа на свой вопрос: чтобы динамически присваивать результаты запроса правильным свойствам, вы бы использовали отражение. Смотрите документацию к системе.Пространство имен Reflection, если вам нужна дополнительная информация.