Dapper正确的对象/聚合映射

7

最近,我开始评估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 Saffron
感谢您的回复,Sam。那么,是否有一种非自动化但使用 SQL 查询的解决方案呢?这可行吗?此外,在 Stack Overflow 中如何处理这个问题(如果有的话)?或者是生成单独的查询来处理这种类型和复杂性的关系? - mreyeros
下午好,Sam。我有一个快速问题,我注意到在查询方法中,我可以使用其中一种方法重载来传递最多5个对象。这个方法能用来生成我正在尝试做的事情吗?还是我误解了它的用法? - mreyeros
1个回答

9

我有类似的情况。我将我的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();

所以,在查询标签中最后一个对象是返回对象。对于SplitOn,您必须将返回值视为映射将运行的平面数组。您将选择每个新对象的第一个返回值,以便新映射从那里开始。
示例:
select ID,fooid, foo1,foo2,BarName,barsomething,foobarid foobaritem1,foobaritem2 from blah

分隔符为"ID,fooid,BarName,foobarid"。当它运行返回集时,它将映射在每个对象中找到的属性。 希望这有所帮助,并且您的返回集不会太大而无法返回平面结果。

非常棒的Arnej65,这肯定会对我有很大帮助。 - mreyeros
当查询在存储过程中时(因此您基本上调用传递参数的存储过程),这也是可能的吗? - Krzysztof Branicki
1
@KrzysztofBranicki 是的。在我的情况下,我有存储过程查询所有需要的数据,并以平面输出返回。 - Omnia9

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接