Форум программистов, компьютерный форум, киберфорум
C#: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.56/16: Рейтинг темы: голосов - 16, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 25.08.2020
Сообщений: 22

Возможно ли использование Dapper без типизации данных?

17.09.2020, 15:09. Показов 3424. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Собственно вопрос по Dapper к знающим людям.
Предисловие: пользователю нужно периодически выгружать данные из СУБД, при этом сам sql запрос может менятся (добавлятся или удалятся поля), или пользователь вообще можно написать типа такого select * from table (выгрузить все поля, но их не перечислять), вопрос можно ли это реализовать с помощью орм, в данном случае Dapper, выгрузку данных не зная кол-во и порядок получаемых полей для сохранения на пример в файл?

Что я сдела на данный момент:
есть два класса:
первый - это класс доступа к БД
C#
1
2
3
4
5
6
7
8
 public List<sql_table_mapping.uni_table_mapping> GetUser(string sql_query)
        {
            using (OracleConnection connection_ = new OracleConnection(read_settings.connectionsString))
            {
                var output = connection_.Query<sql_table_mapping.uni_table_mapping>(sql_query).ToList();
                return output;
            }
        }
Ну и второй это собственно мапинг полей
C#
1
2
3
4
5
6
7
8
9
10
    public class sql_table_mapping
    {
        public class uni_table_mapping
        {
            public string USERSTATUS { get; set; }
            public string USERUKR { get; set; }
            public string TYP_PROJECT { get; set; }
            public string STORE_LIST { get; set; }
        }
    }
ну и получаю данный таким образом -
C#
1
GetUser(textBox1.Text);
через текст бокс передаю сам sql запрос.

Я знаю что через даппер можно получить данные таким образом (без класса для маппинга полей)
C#
1
connection_.Query<dynamic>(sql_query).ToList();
или вообще так
C#
1
connection_.Query(sql_query).ToList();
но вот как дальше работать с результатом не понятно((( в таблицу не записать, в файл не записать((

Может кто то подсказать в каком направлении "копать"?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.09.2020, 15:09
Ответы с готовыми решениями:

Использование var или уход от строгой типизации
Алоха! Стал программить на C# совсем недавно, на компе стоит VS 2010 + Resharper. Так вот статистический анализатор кода в Resharper...

Как перебрать все элементы любого List без типизации?
Добрый день. Подскажите пожалуйста можно ли как то перебрать все элементы в списке без указания типа, и если да то как? Дело в том, что...

Возможно ли использование классов .Net на системе без установленного фреймворка?
Доброго времени суток. Возможно ли скомпилировать экзешник таким образом, чтобы он содержал в себе используемые классы фреймворка? ...

8
Эксперт .NET
 Аватар для Usaga
14093 / 9310 / 1349
Регистрация: 21.01.2016
Сообщений: 34,973
17.09.2020, 15:47
Latar, в этом случае вам никакая ORM не помощник. В том числе и Dapper.

Если состав данных неизвестен, то и класс под незнамо что вы тоже не создадите. Тут вам подойдёт или DataTable или аналогичная вещь самописная (если надо). Ну и выгребать данные придётся руками, через ADO.NET, c чтением SqlDataReader.
0
0 / 0 / 0
Регистрация: 25.08.2020
Сообщений: 22
17.09.2020, 16:48  [ТС]
И все-таки, если выгрузить таким образом
C#
1
var query = connection_.Query<dynamic>(read_settings.dashboard_all_stor);
то я получаю данные ввиде словаря (см. скрин), есть ключи и значения


можно ли привести эти данные к табличному виду?
вот так
C#
1
2
3
4
5
6
foreach (var rows in query)
                    {
                        var fields = rows as IDictionary<string, object>;
                        var col = fields.Keys;
                        var val_row = fields.Values;
                    }
можно получить отдельно ключи (они же названия полей) и значения (второй скрин), только вот как из этого построить таблицу?
Миниатюры
Возможно ли использование Dapper без типизации данных?   Возможно ли использование Dapper без типизации данных?  
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
17.09.2020, 23:26
Вам уже объяснили, что любая ORM (Dupper в т.ч) - это модель, состоящая из сущностей, отображающих соответствующие сущности в БД.

Если Вы не знаете заранее, что Вам вернет запрос (хотя это уже само собою несколько странно), то ни к какой модели (классу) эти данные привязать нельзя. Поэтому единственный способ работы с ними - это массивы, словари и коллекции строк, состоящих из примитивов (int, string, datetime..), при работе с которыми нужно явное приведение типа.

Далее. Любая ORM предоставляет лишь классы Модели и некоторый механизм доступа к ним. Однако ничто не мешает программисту выдумать какой угодно класс, добавить его к Модели и юзать как обычно, не взирая на то, что он не соответствует никакой сущности в БД.

Например, есть таблица в БД User, которой соответствует класс-модель и есть некий метод для извлечения или изменения этой модели.
Но надо выполнить запрос, в котором к юзерам будет добавлены какие-то поля из других таблиц. Этот НД - виртуальный, т.к. живет только в Вашем приложении. Для того, чтобы работать с ним в "классической" манере, достаточно написать свой класс, свойства которого будут соответствовать полям датасета и написать метод, который выполнит запрос и вернет набор моделей этого класса. Например ENumarable<NewClass> или List<NewClass>. И работайте с этими наборами точно так же, как и с наборами, поставляемыми ORM
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,227
18.09.2020, 00:06
Как вариант, можно метапрограммированием побаловаться.
Предполагаем что все данные из одного запроса однотипные (одинаковые поля).

Берем первую строку, строим метаданные объекта (EntityMetadata).
У EntityMetadata есть коллекция FieldMetadata.
Также добавить в кучу свойство Name, чтобы было удобночитаемое и понятное описание того, что это за сущность.

Перебираем свойство Keys первой строки, инициализируем коллекцию FieldMetadata.
Для каждого из них пытаемся вывести тип поля -
0. Чистим данные - триммим строку.
1. Парсим как целое, не парсится? К шагу 2.
2. Парсим как с плавающей запятой, не парсится? - К шагу 3.
3. Парсим как guid. Не парсится? - К шагу 4.
4. Оставляем строкой.

Ну и пишем тип, у которого будет один метод для генерации динамической сущности.
Также пишем тип, который будет генерировать метаданные.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public interface IMetadataFactory { 
     EntityMetadata CreateMetadata(IDictionary<string, object> row);
}
 
public interface IEntitiesGenerator {
     DynamicEntity GenerateEntity(EntityMetadata metadata, IDictionary<string, object> row);
}
 
public abstract class DynamicEntity: IHasEntityMetadata { 
    protected DynamicEntity(EntityMetadata meta) {
              Metadata = meta;
    }
 
    EntityMetadata Metadata {get;}
}
 
 
public interface IHasEntityMetadata {
    EntityMetadata Metadata {get;}
}
Все что вам нужно сделать:
1. Реализовать IMetadataFactory, создающий метаданные сущности на основе строки.
2. Реализовать IEntitiesGenerator, который будет создавать на основе каждой строки объект, производный от DynamicEntity.

И динамически уже в таблице выполнять привязку к этим полям. Это навскидку, возможно в процессе написания будут какие-то тонкости.


Добавлено через 10 секунд
Можно на основе используемых колонок получать какой-то хэш и его строковое представление использовать для именования типа динамической сущности. Ну это уже детали для IEntitiesGenerator.
0
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
18.09.2020, 02:34
IamRain, А причем тут Dupper собственно ?
0
 Аватар для IamRain
4693 / 2701 / 734
Регистрация: 02.08.2011
Сообщений: 7,227
18.09.2020, 02:46
MsGuns, да Dapper по сути уже и не причем, ТС просил обойтись вообще без типизации данных:
Цитата Сообщение от Latar Посмотреть сообщение
без типизации данных
Метапрограммирование как раз позволяет избавиться от явного создания типов в compile time под конкретный набор полей.
И при этом остается возможность для привязки данных в контролах.
Удобно ведь.
1
1497 / 1238 / 245
Регистрация: 04.04.2011
Сообщений: 4,363
18.09.2020, 11:43
IamRain, Хороший комментарий, буду знать
0
0 / 0 / 0
Регистрация: 25.08.2020
Сообщений: 22
18.09.2020, 17:20  [ТС]
По итогу второго дня, я добился желаемого результата с использованием даппера.
Всем спасибо за ответы......
ЗЫ: всем кто говорил что это не возможно - большой привет
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.09.2020, 17:20
Помогаю со студенческими работами здесь

Возможно ли использование java апплетов непосредственно в VB без использования WebBrouser и html?
Возможноли использование java апплетов непосредственно в VB без использования WebBrouser и html. Возможно есть какой либо конторол для...

Ошибка типизации данных (Variable not defined)
всем привет, у меня выскочила ошибка и я не знаю что делать, подскажите как исправить :)

Dapper + razor page. Пытаюсь добавить данные, но нет и ошибок и данных в БД
Я разрабатываю веб-страницу, используя Razor-страницу и библиотеку dapper для добавления данных в БД. Razor-page public class...

Отзывы без базы данных - возможно ли
можно ли сделать сие, если не знаешь имя базы данных.... отзывы проще, там сохраняешь в файл.... при необходимости файл...

Возможно ли использование Application.Wait ("HH:MM:SS") без полной загрузки ЦП
Возможно ли использование Application.Wait (&quot;HH:MM:SS&quot;) без полной загрузки ЦП... или может есть другой аналог какой то функции...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru