Utilisation d'une requête personnalisée pour sélectionner des éléments dont leur identifiant existe dans une liste d'ID

c# dapper mysql ormlite-servicestack

Question

En dapper vous pouvez faire quelque chose comme:

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

essayant de faire la même chose dans ormlite:

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

renvoie une erreur. Dapper crée la requête en tant que telle:

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

où ormlite génère:

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

Les crochets ne sont pas valides dans MySQL. Est-il possible de faire cela en ormlite?

Lorsque j'essaie d'utiliser la classe anonyme pour répertorier les paramètres, comme dans l'exemple dapper, elle ne trouve pas le deuxième paramètre.

Réponse acceptée

Pour effectuer une instruction SQL IN , OrmLite doit pouvoir échapper à toutes les valeurs quand il le faut (par exemple, s'il s'agit de valeurs de chaîne). Donc, si vous utilisez du SQL brut dans OrmLite, vous pouvez faire:

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));

Bien que la plupart du temps il ne soit pas nécessaire d'utiliser le SQL brut dans OrmLite, c'est plus succinct et portable si vous utilisez plutôt l'API typée. par exemple:

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

Vous pouvez également utiliser [Alias] si votre table n'a pas le même nom que le POCO, et peut également spécifier le [Schema] avec:

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

Qui utilisera plutôt le nom de schéma et de table spécifié lors de l'interrogation de la base de données.




Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi