2017-05-11 3 views
0

Ich versuche Dapper in meinem Projekt zu verwenden Laden von Daten zu beschleunigen (derzeit mit EF6)Dapper Multi-Level-Verschachtelung

Hier ist meine 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; 

ich meine Entity Framework Entitäten als POCOs verwende und sie sind

VwArtikliGridV2, Artikli_TagLista, Artikli_Tagovi, Artikli_Stanje

VwArtikliGridV2 hat zwei Eigenschaften

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

und Artikli_TagLista hat

public virtual Artikli_Tagovi Artikli_Tagovi { get; set; } 

Was ist der einfachste Weg, um die Abfrage und Karte meine Daten an die POCOs oder Entitäten ausführen?

Ich versuchte

Dapper.Mapper

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

aber es didnot

Ich habe auch versucht hat nicht funktioniert auch

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

Aber es Slapper.AutoMapper arbeiten.

Ich kann VwArtikliGridV2 zuordnen, aber ich kann keine der verschachtelten Objekte zuordnen. Sie sind immer null.

Was kann ich versuchen?

Antwort

0

Dapper Karten Dinge flach. Das fühlt sich zuerst wie ein großer Schmerz an, weil EF die Dinge so einfach nistet. Aber sobald Sie über den anfänglichen Schmerz hinwegkommen, erkennen Sie, wie einfach, vorhersehbar und leistungsorientiert es ist. Vielleicht noch 15 min. von Query-Crafting für unberührbare Leistung.

Ich beantwortete eine ähnliche Frage hier return a list of data via stored proc to dapper.

Sie sollten mehrere Datensätze (einen für das übergeordnete Element, einen für die zugrunde liegenden Tags usw.) zurückgeben und sie in Ihrer App-Ebene kombinieren können.

0

Wie Black JacketMack in seiner Antwort sagte, denke ich, mehrere Datensätze sind der Weg zu gehen.

Sie könnten in der Dapper-Dokumentation zu den Merkmalen Multi Mapping aufzuspalten einzelne Zeilen in mehrere Objekte suchen möchten, und QueryMultiple mehrere Ergebnismengen aus einer einzigen Abfrage zu lesen.

Offensichtlich würde es bedeuten, Ihre Abfrage zu modifizieren, um mehrere Ergebnismengen zurückzugeben, aber könnte erreichen, wonach Sie suchen.https://github.com/StackExchange/Dapper/blob/master/Dapper.Tests/MultiMapTests.cs

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

Insbesondere möchten Sie vielleicht einen Blick auf Verfahren public void TestMultiMapThreeTypesWithGridReader() in MultiMapTests.cs:

Beispiele finden Sie hier. Ich fand das sehr nützlich, um mir zu helfen, ein ähnliches Problem von Eltern mit Kindsammlungen zu verstehen, wo das Kind verschiedene Objekttypen enthält, die in einer einzelnen Reihe zurückgegeben werden.