2012-07-10 59 views
0

問題同類型: 我試圖用PetaPoco加入四個以上的表來填充類型A的對象與B型(對這個問題非常相似的五名成員:https://stackoverflow.com/a/11275334/296296 )。從我讀過它有可能使用這個語法:多加入到PetaPoco

var result = db.Query<Investment>(new System.Type[] { typeof(Investment), typeof(Person), typeof(Person), typeof(Person), typeof(Person), typeof(Person) }, null, sql, null).FirstOrDefault(); 

當SQL是:

 SELECT Investment.*, p1.*, p2.*, p3.*, p4.*, p5.* FROM Investment 
     INNER JOIN People p1 ON Investment.OwnerID = p1.Id 
     INNER JOIN People p2 ON Investment.ITOwnerID = p2.Id 
     INNER JOIN People p3 ON Investment.InformationOwnerId = p3.Id 
     INNER JOIN People p4 ON Investment.MaintenanceLeaderId = p4.Id 
     INNER JOIN People p5 ON Investment.MaintenanceLeaderITId = p5.Id 
     WHERE (Investment.Id = @0) 

,但它只是給了我以下錯誤:

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 
} 

爲了做到這一點,我需要爲每個Person類型的i加入People表n投資類,並將它們映射到相應的屬性,作爲Person類型的實例。

回答

0

你可能做到這一點的唯一方法是創建您自己的回調(而不是讓它回落到目前正在調用的自我發現這就是回調),您線了每個Person對象的投資對象。

爲什麼你不能做到這一點看看http://www.toptensoftware.com/Articles/115/PetaPoco-Mapping-One-to-Many-and-Many-to-One-Relationships

+0

好了,我的想法,但我有點不確定如何實現它。這是否意味着我必須用足夠的參數來擴展'IEnumerable 查詢(Func ',然後提供我自己的lambda /回調函數?'(inv,p1,p2,p3,p4,p5)=> inv.Owner = p1,inv.ITOwner = p2 ...'? – Mitch99 2012-07-18 09:32:56

0

:用於測試選擇

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#代碼

///// SQL代碼

1 - 將您的投資POCO擴展爲具有2個列,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") 
        ); 
    } 

這種方式唯一的類將需要特殊處理將是投資類,你需要向後從InvestmentView將數據處理成POCO的平面結構。