PetaPOCO和超过4个加入

问题描述 投票:2回答: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
}

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

class B
{
    G member0;
}

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

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

c# orm petapoco
2个回答
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中有一个关联回调的概念,你可以编写一个小类来处理单个结果行中的不同pocos,并将每个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/

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


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在哪里映射新数据,你就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.