我正在尝试在我的项目中使用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,但我无法映射任何嵌套对象。它们总是空的。
我可以尝试什么?
答案 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()
。我发现这对于帮助我理解父子集合的类似问题非常有用,其中子集包含在单行中返回的不同对象类型。