【问题标题】:Dapper Correct Object / Aggregate MappingDapper 正确的对象/聚合映射
【发布时间】:2011-08-29 22:39:52
【问题描述】:

我最近开始评估 Dapper 作为 EF 的潜在替代品,因为我对正在生成的 SQL 不太满意,并希望对其进行更多控制。我有一个关于在我的域模型中映射复杂对象的问题。假设我有一个名为 Provider 的对象,Provider 可以包含几个 IEnumerable 类型的属性,这些属性只能通过父提供者对象(即聚合根)访问。我看过类似的帖子,这些帖子使用 QueryMultiple 和 Map 扩展方法进行了解释,但我想知道我是否想编写一个方法来恢复整个对象图的急切加载,如果 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
           ...
      }

有没有使用 Dapper 填充整个对象图的简单方法?

【问题讨论】:

  • 你将不得不为此构建一些手动扩展,没有用于图发现和自动 SQL 生成的内置方法
  • 感谢您的回复 Sam,如果不是自动而是使用 SQL 查询的解决方案呢?那可能吗?此外,如果有的话,SO 是如何处理的?或者是否正在生成单独的查询来处理这种类型和复杂性的关系?
  • 下午好 Sam,我注意到另一个快速问题,在 Query 方法中,我可以使用其中一个方法重载传递多达 5 个对象。这种方法可以用来生成我在这里尝试做的事情,还是我误解了它的用法?

标签: dapper


【解决方案1】:

我也有类似的情况。我让我的 sql 返回平面,以便所有子对象都回来。然后我使用 Query 来映射整个集合。我不确定你的系列有多大。

所以是这样的:

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();

所以 Query 标记中的最后一个对象是返回对象。对于 SplitOn,您必须将返回视为映射将运行的平面数组。您将为每个新对象选择第一个返回值,以便新的映射从那里开始。

示例:

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

拆分将是“ID,fooid,BarName,foobarid”。当它在返回集上运行时,它将映射它可以在每个对象中找到的属性。

我希望这会有所帮助,并且您的退货集不会太大而无法平展。

【讨论】:

  • 优秀的 Arnej65,这对我有很大帮助。
  • 当查询在存储过程中时这也可能吗(所以你基本上调用存储过程传递参数)?
  • @KrzysztofBranicki 是的。在我的例子中,我有存储过程来查询所有需要的数据,并以平面输出返回。
猜你喜欢
  • 2019-10-29
  • 2021-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多