Usar una consulta personalizada para seleccionar elementos donde su id existe dentro de una lista de ID

c# dapper mysql ormlite-servicestack

Pregunta

En dapper puedes hacer algo como:

var items = connection.Query<Items>("SELECT * FROM `@database`.`table`  WHERE `id` IN @idList;", new {database = DatabaseName, idList = someList.Select(n => n.id)});

tratando de hacer lo mismo en ormlite:

var items = connection.Query<Items>("SELECT * FROM {0}`.`table`  WHERE `id` IN {1};", DatabaseName, someList.Select(n => n.id)});

devuelve un error Dapper crea la consulta como tal:

SELECT * FROM `someDB`.`table` WHERE `id` IN (1,2,3,4);

donde ormlite genera:

SELECT * FROM `someDB`.`table` WHERE `id` IN [1,2,3,4];

Los corchetes no son válidos en MySQL. ¿Es posible hacer esto en ormlite?

Cuando intento usar la clase anónima para listar parámetros, como en el ejemplo de dapper, no puede encontrar el segundo parámetro.

Respuesta aceptada

Para hacer una instrucción SQL IN , OrmLite necesita poder escapar de todos los valores cuando lo necesite (es decir, si son valores de cadena). Entonces, si usa SQL sin formato en OrmLite, puede hacer lo siguiente:

var ids = someList.Select(n => n.id).ToArray();

var items = db.Select<Items>(
    "SELECT * FROM `{0}`.`table`  WHERE `id` IN ({1})", 
    DatabaseName, new SqlInValues(ids));

Aunque la mayoría de las veces no necesita usar Raw SQL en OrmLite, es más sucinto y portátil si en su lugar utiliza la API tipada. p.ej:

var items = db.Select<Items>(q => Sql.In(q.Id, ids));

También puede usar [Alias] si su tabla no tiene el mismo nombre que POCO, y también puede especificar el [Schema] con:

[Schema("DatabaseName")]
[Alias("table")]
public class Items 
{
    public int Id { get; set; }
    public string Name { get; set; }
}

En su lugar, utilizará el esquema y el nombre de tabla especificados al consultar el db.



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