C# PetaPoco中同一类型的多个联接

C# PetaPoco中同一类型的多个联接,c#,orm,petapoco,C#,Orm,Petapoco,问题: 我试图使用PetaPoco连接四个以上的表,用五个类型为B的成员填充类型为A的对象,这与这个问题非常相似:。根据我的阅读,可以使用以下语法: var result = db.Query<Investment>(new System.Type[] { typeof(Investment), typeof(Person), typeof(Person), typeof(Person), typeof(Person), typeof(Person) }, null, sql, nu

问题: 我试图使用PetaPoco连接四个以上的表,用五个类型为B的成员填充类型为A的对象,这与这个问题非常相似:。根据我的阅读,可以使用以下语法:

var result = db.Query<Investment>(new System.Type[] { typeof(Investment), typeof(Person), typeof(Person), typeof(Person), typeof(Person), typeof(Person) }, null, sql, null).FirstOrDefault();
但它只给了我以下错误:

 Can't auto join Person as Investment has more than one property of type Person
有没有人有同样的问题或者可以提供任何帮助

背景:

我有以下简化的数据库表:

Investment
--------------
Id
Name
OwnerId
ITOwnerId
InformationOwnerId
MaintenanceLeaderId
MaintenanceLeaderITId

People
--------------
Id
Name
我想将这些数据库表映射到的类有:

 Public class Investment {
    public int Id 
    public string Name
    public Person Owner
    public Person ITOwner
    public Person InformationOwner
    public Person MaintenanceLeader
    public Person MaintenanceLeaderIT
 }

 Public class Person {
    public int Id 
    public string Name
 }

为此,,我需要为Investment类中的每个Person类型加入People表,并将它们作为Person类型的实例映射到相应的属性。

唯一可能做到这一点的方法是创建自己的回调,而不是让它返回到当前正在调用的自发现回调,在那里您将每个回调连接起来投资对象上的Person对象


看看你为什么不能这样做:

/////用于测试选择项的SQL代码

DECLARE @People TABLE (Id INT,  Name VARCHAR(50))
        INSERT INTO @People (Id,Name)
            SELECT 1,' John Smith' UNION ALL
            SELECT 2,'Albert Lee' UNION ALL
            SELECT 3,'Christina Wetherbe' UNION ALL
            SELECT 4,'Alice Cany' UNION ALL
            SELECT 5,'Jim Blabery' UNION ALL
            SELECT 6,'Octaviose Mayflower' UNION ALL
            SELECT 7,'Sandra Lee M' UNION ALL
            SELECT 8,'Some test user' UNION ALL
            SELECT 9,'Some test user 2' UNION ALL
            SELECT 10,'Some test user 3' UNION ALL
            SELECT 11,'Some test user 4' 


    DECLARE @Investment TABLE (
                    Id INT,
                    Name VARCHAR(50),
                    OwnerId INT,
                    ITOwnerId  INT,
                    InformationOwnerId INT,
                    MaintenanceLeaderId INT,
                    MaintenanceLeaderITId INT
                )


    INSERT INTO @Investment(Id,Name,OwnerId,ITOwnerId,InformationOwnerId,MaintenanceLeaderId,MaintenanceLeaderITId)
    SELECT 1,'INVESTMENT 1',1,2,1,3,4 UNION ALL
    SELECT 2,'INVESTMENT 2',1,3,2,3,2 UNION ALL
    SELECT 3,'INVESTMENT 3',3,1,3,3,4 UNION ALL
    SELECT 4,'INVESTMENT 4',5,4,4,2,3 UNION ALL
    SELECT 5,'INVESTMENT 5',6,5,5,7,6 UNION ALL
    SELECT 6,'INVESTMENT 6',8,6,6,7,8 UNION ALL
    SELECT 7,'INVESTMENT 7',9,8,7,4,5 UNION ALL
    SELECT 8,'INVESTMENT 8',11,8,8,6,11 UNION ALL
    SELECT 9,'INVESTMENT 9',10,9,9,10,9


    --SELECT * FROM @People
    --SELECT * FROM @Investment

     -- THIS IS YOUR SELECT STATEMENT to be uses in PetaPoco call
    SELECT unpv.Id,unpv.Name, unpv.INVTYPE,unpv.PersonId,p.Name FROM @Investment
    UNPIVOT(PersonId for INVTYPE in    (OwnerId,ITOwnerId,InformationOwnerId,MaintenanceLeaderId,MaintenanceLeaderITId))unpv 
    join @People p on unpv.PersonId = p.Id
    order by INVTYPE, PersonId
然后C代码为

1-扩展您的投资POCO,增加两列,INVTYPE和PersonId。只需在相同的名称空间中创建新对象。像这样:

    public partial class Investment
    {
        [ResultColumn]
        public string INVTYPE { set; get; }
        [ResultColumn]
        public int PersonId { set; get; }
    }
2-创建viewclass InvestmentView您可以使用您的投资类,只需重命名它即可

   var myInvestmentView = new InvestmentView
                            {
                              Id = result.Id,
                              Name = result.Name,
                              Owner = new Person{ Id = result.firstOrDefault(o => o.INVTYPE.Equals("OwnerId")).PersonId, Name =  result.firstOrDefault(o=> o.INVTYPE.Equals("OwnerId")).PersonName},
                              ITOwner  = new Person{ Id = result.firstOrDefault(o => o.INVTYPE.Equals("ITOwnerId")).PersonId, Name =  result.firstOrDefault(o=> o.INVTYPE.Equals("ITOwnerId")).PersonName},
                              InformationOwner  = new Person{ Id = result.firstOrDefault(o => o.INVTYPE.Equals("InformationOwnerId")).PersonId, Name =  result.firstOrDefault(o=> o.INVTYPE.Equals("InformationOwnerId")).PersonName},
                              MaintenanceLeader = new Person{ Id = result.firstOrDefault(o => o.INVTYPE.Equals("MaintenanceLeaderId")).PersonId, Name =  result.firstOrDefault(o=> o.INVTYPE.Equals("MaintenanceLeaderId")).PersonName},
                              MaintenanceLeaderIT = new Person{ Id = result.firstOrDefault(o => o.INVTYPE.Equals("MaintenanceLeaderITId")).PersonId, Name =  result.firstOrDefault(o=> o.INVTYPE.Equals("MaintenanceLeaderITId")).PersonName}
                            }  
3-使用返回列表中的数据填充类

    using (var data = new Database(Config.MainDbConnectionName))
    {
       var result = data.Fetch<Investment,People>(
                        Sql.Builder
                           .Append("SELECT unpv.Id,unpv.Name, unpv.INVTYPE,unpv.PersonId,p.name as PersonName FROM Investment")
                           .Append(" UNPIVOT(PersonId for INVTYPE in    (OwnerId,ITOwnerId,InformationOwnerId,MaintenanceLeaderId,MaintenanceLeaderITId)) unpv")
                           .Append(" JOIN People p on unpv.PersonId = p.Id")
                           .Append(" WHERE (Investment.Id = @0)",InvId)
                           .Append(" ORDER BY INVTYPE, PersonId")
                    );
    }

这样,唯一需要特殊处理的类将是Investment类,因为您需要将数据从InvestmentView向后处理到POCO的平面结构中。

好的,我明白了,但我有点不确定如何实现它。这是否意味着我必须用足够的参数扩展IEnumerable QueryFunc,然后提供自己的lambda/回调函数?存货,p1,p2,p3,p4,p5=>存货所有者=p1,存货所有者=p2。。。?
    using (var data = new Database(Config.MainDbConnectionName))
    {
       var result = data.Fetch<Investment,People>(
                        Sql.Builder
                           .Append("SELECT unpv.Id,unpv.Name, unpv.INVTYPE,unpv.PersonId,p.name as PersonName FROM Investment")
                           .Append(" UNPIVOT(PersonId for INVTYPE in    (OwnerId,ITOwnerId,InformationOwnerId,MaintenanceLeaderId,MaintenanceLeaderITId)) unpv")
                           .Append(" JOIN People p on unpv.PersonId = p.Id")
                           .Append(" WHERE (Investment.Id = @0)",InvId)
                           .Append(" ORDER BY INVTYPE, PersonId")
                    );
    }