Dapper unbegrenzte Multi-Mapping

c# dapper

Frage

So habe ich eine Situation, in der ich mehr als 7 Entitäten (und so weit ich sehe, ist die aktuelle Begrenzung von Dapper) beitreten (und zuordnen) muss. Das habe ich bisher (Pseudocode):

using (var connection = new SqlConnection(_connectionString)) {
   IEnumerable<BigEntity> results = 
      connection.Query<BigEntity, Lookup1, Lookup2, ... around 10 of them>(sql, 
         (b, l1, l2, l3) => {
            // map and return here
         },
         splitOn: "split1, split2 ...");
}

Gibt es einen Weg um diese Einschränkung? Wer hat das schon einmal erlebt? Einige Dapper-Erweiterungen vielleicht?

Akzeptierte Antwort

Momentan gibt es nur zwei Möglichkeiten, wie ich das umgehen kann:

  • Erstellen Sie eine POCO-Klasse mit den gewünschten Feldern und verwenden Sie Ihre Abfrage wie eine Tabelle
  • Ändern Sie den Dapper-Quellcode, um mehr Zuordnungen zu ermöglichen.

Beliebte Antwort

Seit September 2014 gibt es eine gemischte PR zu diesem Thema:

https://github.com/StackExchange/Dapper/pull/158/files

Die PR hinzugefügt Methoden, wo Sie ein Array von Typen übergeben können. Daher existiert die Beschränkung auf 7 Entitäten bei diesen Methoden nicht mehr.

Dies ist ein Code-Test aus dem Dapper Repo, der zeigt, wie man eine dieser neuen Methoden verwendet:

public async Task TestMultiMapArbitraryWithSplitAsync()
    {
        const string sql = @"select 1 as id, 'abc' as name, 2 as id, 'def' as name";
        var productQuery = await connection.QueryAsync<Product>(sql, new[] { typeof(Product), typeof(Category) }, (objects) => {
            var prod = (Product)objects[0];
            prod.Category = (Category)objects[1];
            return prod;
        });

        var product = productQuery.First();
        // assertions
        product.Id.IsEqualTo(1);
        product.Name.IsEqualTo("abc");
        product.Category.Id.IsEqualTo(2);
        product.Category.Name.IsEqualTo("def");
    }


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow