2

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
}

然后更复杂的是,如果成员 1(类型 B)本身有一些复合对象怎么办?如果我们有:

class B
{
    G member0;
}

请不要提出多次访问数据库的解决方案,因为当对象变得有点复杂时,调用会太多。

哦,我也知道解决无限连接情况的另一种方法是创建一个非常扁平的对象,它将所有字段组合在一起。这根本不是一个优雅的解决方案。

4

3 回答 3

4

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);

您可以有多个一对多关系,但 Schotime 是对的,您需要非常小心返回结果集中的大量重复数据。写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/

如果我绝对必须一次性将所有数据连接到您建议的复杂和嵌套对象,那么我将使用存储过程(单个数据库调用)并将它们与代码拼接在一起。只有这样我才能弄清楚如何在 Petapoco 中做到这一点。但是,如果您的 UI 在用户单击扩展器按钮(或类似按钮)之前不显示所有嵌套数据,那么我会在那时使用 AJAX 调用,而不是最初获取所有数据。

于 2012-06-30T15:30:54.277 回答
0

答案是正确的,但我是从另一个论坛来到这个页面的,那里没有人可以完成这项工作,所以我想我会加入我所做的事情以使事情更清楚。基本上,我有如下代码:

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 个 pocos 进行查询,而不必修改 PetaPoco 代码。唯一要做的事情是添加到您的关系器类中,这样您就可以告诉 PetaPoco 将新数据映射到哪里,您就可以开始了。

于 2018-03-05T21:01:52.727 回答
0

委托: 注意:你不必(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);
        }
于 2021-05-15T17:09:27.487 回答