Personalizar SQL con extensiones Dapper

c# dapper micro-orm orm

Pregunta

Estoy usando Dapper Extensions para algunos de mis tipos y funciona muy bien para la mayoría de los casos de uso. Me encontré con un caso en el que tengo una relación de muchos y muchos, y quiero hacer algo como:

SELECT id,a,b,c FROM Foo WHERE Foo.id in (SELECT foo_id FROM foo-bar WHERE bar-id=@bar_id)

Obviamente, Dapper Extensions puede manejar "SELECT id, a, b, c FROM Foo" pero no la última parte. Podría hacer una selección para obtener la lista de identificación de Foo que quiero, y luego pasarla a Dapper Extensions, pero eso es menos eficiente.

La parte que no puedo hacer con el simple Dapper es obtener la lista de columnas SELECCIONAR automáticamente, así que lo que realmente me gustaría es una forma de:

  • Obtenga la lista de columnas SELECT de los mecanismos internos de la Extensión Dapper
  • Obtenga el "SELECT ID, a, b, c FROM Foo" básico de los mecanismos internos de Dapper Extension
  • Extensiones de Hook Dapper Obtenga el código para que pueda agregar una cláusula WHERE personalizada

Miré el código, pero no puedo ver cómo hacer ninguna de estas cosas. ¿Alguien puede ayudar? He trabajado con Dapper simple y "SELECT * ..." en este momento, pero estoy seguro de que hay una mejor manera.

Respuesta aceptada

No sabía que esto no era compatible en 2012. Así que aproximadamente 1,7K vistas en dos años y no mucha exposición. Pero en caso de que alguien nuevo en Dapper aterrice aquí y se pregunte si funciona, la respuesta es que está funcionando. Usando la última versión de, al momento de escribir este documento, Dapper v1.42 de nuget :

var sql = "SELECT id,a,b,c FROM Foo WHERE Foo.id in (
    SELECT foo_id FROM foo-bar WHERE bar-id=@bar_id)"
using (var cn = new SqlConnection(the_connection_string)) {
  cn.Open();
  var returnedObject = cn.Query<dynamic>(sql, new { bar_id = some_value });
}

Respuesta popular

Aquí hay otra opción:

Puedes crear una Vista:

select * from Foo 
join FooBar b
on a.foo_id = b.foo_id

Luego use predicados para seleccionar con cualquier cláusula where:

using (SqlConnection cn = new SqlConnection(_connectionString))
{
    cn.Open();
    var predicate = Predicates.Field<Foo>(f => f.foo_id, Operator.Eq, 1);
    IEnumerable<Foo> list = cn.GetList<Foo>(predicate);
    cn.Close();
}

El SQL generado debería tener el siguiente aspecto:

SELECT 
   [Foo].[foo_id]
 , [Foo].[...]
 , [Foo].[...]
 , [Foo].[...]
 , [Foo].[...] 
FROM [ViewName] 
WHERE ([ViewName].[foo_id] = @foo_id_0)


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