¿Hay alguna forma de utilizar el multimapa de Dapper con funcs explícitos por tipo?

dapper micro-orm

Pregunta

Estamos buscando la siguiente funcionalidad cuando utilizamos la semántica multimapa para Dapper (Dapper-Dot-Net):

    SqlMapper.Configure.ForTypeUseFunc<T>(Func<dynamic,T> func);

    //example usage
       Func<object,Foo> fooFunc = (dynamic o) => 
    new Foo{ 
    Name = o.Name, 
    Status = (StatusTypes)o.StatusID
    };


    SqlMapper.Configure.ForTypeUseFunc<Foo>(fooFunc);

 cnn.Query<Foo,Bar,Foo>...

Entonces, cuando Dapper divide el IDataReader para el tipo 'Foo', pasa todos los valores como dinámicos a fooFunc y, en consecuencia, haría lo mismo con 'Bar'. El objeto 'dinámico' transferido sería representativo de las columnas divididas (y al igual que el mapa múltiple regular puede tener nombres de columna duplicados).

¿Cómo podemos lograr esto?

Fondo

Utilizamos Dapper de forma exhaustiva en algunas bases de datos heredadas, pero debido a la gran cantidad de patrones antiguos, estamos obligados a usar el resultado dinámico para asignar resultados a objetos (diferentes nombres de columna, objetos anidados, etc.)

La realidad es que, aunque estamos escribiendo el mapeo manual, cualquier inconsistencia entre la base de datos (que está fuera de nuestro control) y nuestro objeto se define de manera perfecta y explícita en el Func. Una base de datos de 50 tablas (que consideraría de tamaño mediano) solo toma un par de horas para trazarse y representa una pequeña fracción de tiempo de cualquier desarrollo ... vale la pena.

Esa es la buena parte.

La parte con la que estamos luchando es que estamos teniendo problemas para obtener una buena reutilización del código de nuestros funcs aunque se comporten perfectamente cuando se usan. Idealmente, tendríamos alguna forma de usar el mapa múltiple de Dapper, pero asignaremos un Func por tipo:

He examinado ITypeMap e IMemberMap y parece que están orientados hacia el mapeo personalizado por campo. Realmente estamos buscando un mapeo personalizado por tipo (y manejaremos las asignaciones).

Estoy contento de tratar de construir esto en Dapper (y han contribuido muy levemente en el pasado) pero me gustaría algo de orientación.

¡Gracias!

ACTUALIZAR

Actualmente estoy intentando Query<dynamic,dynamic,Foo> pero eso no se está dividiendo correctamente. Esto podría funcionar para nosotros si se dividiera correctamente. Podríamos efectivamente conectar cada dinámica en nuestro func y devolver nuestros objetos fuertemente tipados:

Query<dynamic,dynamic,Tuple<Foo,Bar>>((d1,d2)=>Tuple.Create(fooFunc(d1),barFunc(d2)));

Respuesta popular

Dapper es tan astuto que le permite dividirse en múltiples tipos dynamic . Hay muchas implementaciones detrás de escena que podríamos usar para lograr el objetivo deseado. Debajo hay uno.

Query<dynamic,dynamic,Tuple<Foo,Bar>>((d1,d2)=>Tuple.Create(fooFunc(d1),barFunc(d2)));

Eso es genial. Detrás de las escenas puede almacenar el tipo / func en lo que tenga sentido (por ejemplo, Dictionary.

El problema que estamos tratando ahora es que los nombres de columna duplicados tienen números agregados (por ejemplo, AddressID, AddressID1) haciendo que las declaraciones 'SELECT *' no sean tan útiles.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué