petapoco是否能够实现以下目标:
1,无限次加入一个查询
2.一次查询中无限一对多关系
我看过PetaPOCO,看来它不能进行4个以上的连接,最长的签名如下:
db.Query
似乎它也支持一对多关系,但仅适用于一个复合对象,如下所示:
db.FetchOneToMany ,其中T2是T1的外键
我正在测试一些微型ORM,以坚持使用最好的微型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;
}
请不要提出多次访问数据库的解决方案,因为当对象变得有点复杂时,它将导致太多调用。
哦,我也知道解决无限联接情况的另一种方法是创建一个非常扁平的对象,将所有字段组合在一起。这根本不是一个优雅的解决方案。
最佳答案
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调用,而不是最初获取所有数据。
关于c# - PetaPOCO和4个以上的加入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11268519/