2011-08-29 122 views
5

我最近開始評估Dapper作爲EF的潛在替代品,因爲我對生成的SQL並不太滿意,並希望對它進行更多的控制。我有一個關於在我的域模型中映射覆雜對象的問題。比方說,我有一個名爲Provider的對象,Provider可以包含IEnumerable類型的多個屬性,只應通過父提供者對象(即聚合根)來訪問它。我已經看過類似的帖子,它們使用QueryMultiple和Map擴展方法進行了解釋,但是想知道如果我想編寫一個方法可以使整個對象圖急切加載,如果Dapper能夠一舉完成或者如果它需要完成零食。作爲一個例子可以說,我的目標看起來像下面這樣:Dapper正確的對象/聚合映射

public AggregateRoot 
     { 
      public int Id {get;set;} 
      ...//simple properties 
      public IEnumerable<Foo> Foos 
      public IEnumerable<Bar> Bars 
      public IEnumerable<FooBar> FooBars 
      public SomeOtherEntity Entity 
      ... 
     } 

是否有填充用小巧玲瓏的整個對象圖的一種簡單的方法?

+0

您將不得不爲此構建一些手動擴展,沒有內置的圖發現和自動SQL生成方法 –

+0

感謝您的回覆Sam,那麼不是自動的解決方案,而是使用SQL查詢?那可能嗎?另外,如何處理SO呢?或者生成單獨的查詢來處理這種類型的關係和複雜性? – mreyeros

+0

大家下午好,我只是另一個快速問題,我注意到在Query方法中,我可以使用方法重載之一傳遞多達5個對象。這種方法可以用來產生我在這裏想要做的事嗎,還是我誤解了它的用法? – mreyeros

回答

7

我有類似的情況。我使我的sql返回平坦,以便所有的子對象回來。然後我使用查詢<>來映射整個集合。我不確定你的套牌有多大。

因此,像這樣:

var cnn = sqlconnection(); 

var results = cnn.Query<AggregateRoot,Foo,Bars,FooBar,someOtherEntity,AggregateRoot>("sqlsomething" 
       (ar,f,b,fb,soe)=>{ 
        ar.Foo = f; 
        ar.Bars = b; 
        ar.FooBar = fb; 
        ar.someotherentity = soe; 
        return ar; 

       },.....,spliton:"").FirstOrDefault(); 

所以在查詢標籤的最後目標是返回的對象。對於SplitOn,您必須將返回視爲映射將運行的平面數組。您將爲每個新對象選擇第一個返回值,以便新映射從那裏開始。

例如:

select ID,fooid, foo1,foo2,BarName,barsomething,foobarid foobaritem1,foobaritem2 from blah 

的spliton將是 「ID,fooid,BarName,foobarid」。當它遍歷返回集時,它會映射它可以在每個對象中找到的屬性。

我希望這會有所幫助,而且你的回報不會太大而不能回覆。

+0

優秀的Arnej65,這絕對會幫助我很多。 – mreyeros

+0

當查詢在存儲過程中時(這樣你基本上調用存儲過程傳遞參數),這也是可能的嗎? –

+1

@KrzysztofBranicki是的。就我而言,我已經存儲了查詢所有需要的數據的程序,並以平坦的輸出形式返回。 – Arnej65