小巧的多层嵌套

时间:2017-05-11 18:19:22

标签: c# dapper

我正在尝试在我的项目中使用Dapper来加速数据加载(目前使用的是EF6)

这是我的SQL

String SQL = @"select vwArtikli_Grid_V2.ArtikalID
    ,vwArtikli_Grid_V2.ArtikalNaziv
    ,Artikli_TagLista.ArtikalTagListaID
    ,Artikli_TagLista.ArtikalTagID
    ,Artikli_Stanje.ArtikalStanjeID
    ,Artikli_Stanje.ObjekatID
    ,Artikli_Stanje.Stanje
    ,Artikli_Tagovi.GrupaID
    ,Artikli_Tagovi.ArtikalTagGrupaID
    ,Artikli_Tagovi.ArtikalTagNaziv
    ,Artikli_Tagovi.ArtikalTagPrint
    ,Artikli_Tagovi.ArtikalTagSlika
    ,Artikli_Tagovi.ArtikalTagID
    ,vwArtikli_Grid_V2.ArtikalID
from Artikli_Tagovi
inner join Artikli_TagLista on Artikli_Tagovi.ArtikalTagID = Artikli_TagLista.ArtikalTagID
right outer join vwArtikli_Grid_V2 on Artikli_TagLista.ArtikalID = vwArtikli_Grid_V2.ArtikalID
left outer join Artikli_Stanje on vwArtikli_Grid_V2.ArtikalID = Artikli_Stanje.ArtikalID;

我使用我的实体框架实体作为POCO,它们是

VwArtikliGridV2,Artikli_TagLista,Artikli_Tagovi,Artikli_Stanje

VwArtikliGridV2有两个属性

public virtual ICollection<Artikli_TagLista> Artikli_TagLista { get; set; }
public virtual ICollection<Artikli_Stanje> Artikli_Stanje { get; set; }

和Artikli_TagLista有

public virtual Artikli_Tagovi Artikli_Tagovi { get; set; }

执行查询并将数据映射到POCO或实体的最简单方法是什么?

我试过

Dapper.Mapper

var Artikli = cn.Query<VwArtikliGridV2, Artikli_TagLista, Artikli_Stanje, Artikli_Tagovi> (SQL);

但它没有用

我也试过Slapper.AutoMapper

List<dynamic> ArtikliUM = cn.Query<dynamic>(SQL).ToList();

Slapper.AutoMapper.Configuration.AddIdentifiers(typeof(Artikli_Tagovi), new List<string> { "ArtikalTagID" });
Slapper.AutoMapper.Configuration.AddIdentifiers(typeof(Artikli_TagLista), new List<string> { "ArtikalTagListaID" });
Slapper.AutoMapper.Configuration.AddIdentifiers(typeof(Artikli_Stanje), new List<string> { "ArtikalStanjeID" });


Artikli = (Slapper.AutoMapper.MapDynamic<VwArtikliGridV2>(ArtikliUM) as IEnumerable<VwArtikliGridV2>).ToList();

但它也没有用。

我可以映射VwArtikliGridV2,但我无法映射任何嵌套对象。它们总是空的。

我可以尝试什么?

2 个答案:

答案 0 :(得分:0)

Dapper将事物平面化。起初这感觉就像一个巨大的痛苦,因为EF很容易把东西弄得乱七八糟。但是一旦你克服了最初的痛苦,你就会意识到它是多么简单,可预测和以性能为导向。也许额外15分钟。查询 - 制作不可触及的表现。

我在这里回答了一个类似的问题return a list of data via stored proc to dapper

您应该能够返回多个数据集(一个用于父项,一个用于基础标记等),并将它们组合在您的应用层中。

答案 1 :(得分:0)

正如BlackjacketMack在回答中所说,我认为有多种数据可供选择。

您可能希望在功能多重映射中查看Dapper文档,将单行拆分为多个对象,然后使用 QueryMultiple 从单个查询中读取多个结果集。

显然,这意味着修改你的查询以返回多个结果集,但可以实现你想要的。

可以在此处找到示例:https://github.com/StackExchange/Dapper/blob/master/Dapper.Tests/MultiMapTests.cs

https://github.com/StackExchange/Dapper/blob/master/Dapper.Tests/QueryMultipleTests.cs

特别是,您可能需要查看MultiMapTests.cs中的方法public void TestMultiMapThreeTypesWithGridReader()。我发现这对于帮助我理解父子集合的类似问题非常有用,其中子集包含在单行中返回的不同对象类型。