Nano Hash - криптовалюты, майнинг, программирование

PetaPOCO и более 4 объединений

Может ли petapoco достичь следующего: 1. Неограниченное количество объединений в одном запросе 2. Неограниченное количество отношений «один ко многим» в одном запросе

Я посмотрел на PetaPOCO, и кажется, что он не способен выполнять более 4 соединений, самая длинная подпись выглядит так: db.Query‹T1, T2, T3, T4›

Также кажется, что он поддерживает отношение «один ко многим», но только для одного составного объекта, такого как ниже: db.FetchOneToMany‹T1, T2›, где T2 — внешний ключ T1.

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

class A
{
    List<B> member1;
    List<C> member2; 
    Z  member3; //Composit object
    Z1 member4; //Composit object
    Z2 member5; //Composit object
    Z3 member6; //Composit object
    Z4 member7; //Composit object
}

И еще более сложным является то, что если член один (тип B) имеет внутри себя какой-то составной объект? Что, если у нас есть:

class B
{
    G member0;
}

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

О, и я также знаю, что еще один способ справиться с неограниченными соединениями — это создать очень плоский объект, который содержит все поля вместе. Это совсем не элегантное решение.

29.06.2012

  • И, что еще хуже, как насчет класса, у которого есть список, и у списка есть список, и у этого последнего списка есть составной объект !!? 30.06.2012
  • Давайте, ребята??? кто-нибудь пожалуйста ;) 30.06.2012
  • И вам нужны все эти данные для одного экрана? Наличие списка, в котором есть список, уже создаст запрос, который имеет много дублирующих данных (декартово произведение). Обычно я пытаюсь сгладить DTO, в который я возвращаю данные, помните, что вы можете сопоставить любой класс по имени свойства. 30.06.2012
  • а как же списки? потому что для каждого списка мне нужно было бы сделать один вызов, а затем для каждого составного объекта внутри этого списка мне пришлось бы сделать еще один вызов, чтобы получить это! будет много звонков 30.06.2012
  • Попробуйте создать модель представления на C#, которая сглаживает базовые объекты. Затем подключите его к представлению в вашей базе данных, чтобы сгладить соединения. 19.03.2013

Ответы:


1

T1..T$ Query() перегружает все проходы к основному методу Query(..Type[]..). Вы можете либо добавить дополнительные перегрузки Query() для обработки большего количества параметров T, либо передать все нужные вам типы в массиве Type (что и делают функции T1-T4):

Query<TRet>( new Type[]{typeof(Poco1), typeof(Poco2), typeof(Poco3), typeof(Poco4), typeof(Poco5)}, null, sql, args);

У вас может быть несколько отношений один ко многим, но Шотайм прав, вам нужно быть очень осторожным с повторяющимися данными, возвращающимися в ваш набор результатов. Напишите sql-запрос и посмотрите на набор результатов, приемлем ли для вас объем дублирования? Если это так, то в Petapoco есть концепция обратных вызовов отношения, где вы пишете небольшой класс, который обрабатывает разные poco в одной строке результата и добавляете каждый poco в свойства списка родительского poco.

http://www.toptensoftware.com/Articles/115/PetaPoco-Mapping-One-to-Many-and-Many-to-One-Relationships

Мне никогда не приходилось делать это с несколькими от одного до многих, но я цитировал выше

«Если вы присоединяетесь к более чем двум таблицам, вам понадобится что-то более сложное, но на самом деле это просто расширения вышеперечисленного».

Другой вариант - иметь хранимую процедуру, которая выполняет всю работу в одном запросе к базе данных и возвращает несколько наборов результатов, которых, как я полагаю, Schotime достиг в своей ветке petapoco, но я еще не использовал ее сам, поэтому я не могу действительно прокомментируйте, если это поможет здесь:

http://schotime.net/blog/index.php/2011/11/20/petapoco-multiple-result-sets/

Если бы мне обязательно нужно было соединить все данные за один раз для таких сложных и вложенных объектов, как вы предлагаете, я бы использовал хранимую процедуру (один вызов БД) и соединил все это вместе с кодом . Только тогда я разобрался, как это сделать в Петапоко. Однако, если ваш пользовательский интерфейс не отображает все вложенные данные до тех пор, пока пользователь не нажмет кнопку расширения (или аналогичную), я бы использовал вызов AJAX в этот момент, а не изначально получал все данные.

30.06.2012
  • Передача массива типов решила мою очень досадную проблему. Спасибо за помощь! 19.02.2014
  • Есть параметр object cb. Как вы должны создать это? Вы просто создаете Func‹T› и приводите его к объекту? Очень плохая документация. 08.08.2017

  • 2

    Ответ правильный, но я пришел на эту страницу с другого форума, и никто там не мог заставить это работать, поэтому я подумал, что добавлю то, что сделал, чтобы прояснить ситуацию. По сути, у меня был следующий код:

    var sql = "select * from someTable where tableId = @0";
    var listOfStuff = _petapoco.Fetch<FirstType, SecondType, ThirdType, FourthType, FirstType>(new RelatorClass().MapIt, sql, idVar);
    

    Поскольку мне нужно было добавить пятый poco, и все методы Fetch в конечном итоге привели к основному методу Query, указанному выше в принятом ответе, мне пришлось сделать это:

    var sql = "select * from someTable where tableId = @0";
    Func<FirstType, SecondType, ThirdType, FourthType, FifthType, FirstType> mapIt = new RelatorClass().MapIt;
    var listOfStuff = _petapoco.Query<FirstType>(new[] { typeof (FirstType), typeof (SecondType), typeof (ThirdType), typeof (FourthType), typeof(FifthType)}, mapIt, sql, idVar).ToList();
    

    Теперь я могу запросить 5 poco, и мне не нужно было изменять код PetaPoco. Единственное, что еще нужно сделать, это добавить в свой класс отношения, чтобы вы могли указать PetaPoco, где сопоставить новые данные, и все готово.

    05.03.2018

    3

    Делегат: Примечание: вам не нужно возвращать анонимный тип (UserActivity,int) таким образом, вы можете вернуть один тип без круглых скобок! Я просто ленив и не хочу создавать новую модель для возвращаемого типа.

    private delegate (UserActivity, int) GetIt(int fk_AccountTypeValue, UserActivityModel ua, User u, Client c, Client_Account ca);
    

    Операция SQL:

    public List<(UserActivity,int)> SomeMethodName(int orgnizationID)
            {
                        var sql = Sql.Builder
                            .Select("TOP(200) at.FK_AccountTypeValue, ua.*, u.*, c.*, ca.*")
                            .From("UserActivity ua")
                            .LeftJoin("Users u").On("u.PK_UserID = ua.FK_UserID")
                            .LeftJoin("Client c").On("c.FK_UserID = u.PK_UserID")
                            .LeftJoin("Client_Account ca").On("ca.FK_ClientID = c.PK_ClientID")
                            .LeftJoin("AccountType at").On("at.PK_AccountType = c.FK_AccountTypeID")
                            .Where("u.FK_OrganizationID =@0", orgnizationID)
                            .OrderBy("ua.Timestamp desc");
                        GetIt obj = new GetIt(youKnowIt);
                        var typs = new Type[]{typeof(int), typeof(UserActivityModel), typeof(User), typeof(Client), typeof(Client_Account)};
                        var uaList = _database.Query<(UserActivity, int)>(typs, obj, sql.SQL, sql.Arguments).ToList();
                        return uaList;
            }
    

    Метод, указанный делегатом:

    private (UserActivity,int) youKnowIt(int fk_AccountTypeValue, UserActivityModel ua, CurrentDesk.Models.User u, CurrentDesk.Models.Client c, CurrentDesk.Models.Client_Account ca)
            {
                // do stuff
                var uam = new UserActivity()
                {
                    // assign stuff
                };
                return (uam, fk_AccountTypeValue);
            }
    
    15.05.2021
    Новые материалы

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

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..