2011-08-29 149 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