Consulta y usa objetos dinámicos / anónimos de Dapper en VB.Net

.net dapper dynamic vb.net

Pregunta

Tengo una consulta en la que realizo cálculos complejos, incluido el manejo NULL y casos especiales para la división por 0. Este es un ejemplo simplificado, provisto solo como un contexto para el problema:

SELECT
    CASE
        WHEN SUM(f.AmountA) > 0 AND SUM(f.AmountB) > 0 THEN --Perform calculations...
        WHEN SUM(f.AmountB) < 0 THEN --Perform calculations...
        WHEN SUM(f.AmountB) = 0 THEN --Perform calculations...
    END AS Result
FROM Foo f
JOIN Bar b ON b.BarID = f.BarID

Para mejorar el mantenimiento y la legibilidad, me gustaría dejar que los cálculos se realicen con el código .Net. La consulta sería similar a este ejemplo:

SELECT SUM(f.AmountA) AS SumA, SUM(b.AmountB) AS SumB
FROM Foo f
JOIN Bar b ON b.BarID = f.BarID

Entonces, necesitaría consultar esos campos (con Dapper), que no están definidos en un POCO específico. En C #, podría hacer algo similar a lo que se hace en esta respuesta y sus comentarios . Sin embargo, en VB.Net con Option Strict On , no puedo hacer nada de esto.

Para describir mejor lo que estoy tratando de hacer, así es como podría verse, si no fuera por el error Option Strict On disallows late binding en u.SumA y u.SumB dentro de la instrucción New With . Tenga en cuenta que configuro Option Infer On en la parte superior de mi clase:

Using connection As New SqlClient.SqlConnection(myConnectionString)

    Dim result = connection.Query(myQuery).Select(Function(u) New With {.SumA = u.SumA, .SumB = u.SumB}).FirstOrDefault()

    If result.SumA > 0 AndAlso result.SumB > 0 Then
        'Perform calculations...
    End If
    'Other cases...

End Using

Esto probablemente tiene que ver con la falta del tipo dynamic en VB. Por lo tanto, la anulación de Query no genérica devuelve un IEnumerable(Of Object) lugar de su contraparte de C #, IEnumerable<dynamic> .

Mi pregunta es: ¿hay alguna manera de hacer lo que quiero hacer con Dapper y VB.Net?

Respuesta popular

Acabo de escribir una clase de datos simple (privada / interna), que tiene todas las propiedades que necesita para mapear. Sé que es triste, pero eso es vb.net ...



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow