J'utilise Dapper Extensions pour certains de mes types et cela fonctionne très bien pour la plupart des cas d'utilisation. J'ai rencontré un cas où j'ai beaucoup de relations et je veux faire quelque chose comme:
SELECT id,a,b,c FROM Foo WHERE Foo.id in (SELECT foo_id FROM foo-bar WHERE bar-id=@bar_id)
Evidemment, Dapper Extensions peut gérer "SELECT id, a, b, c FROM Foo" mais pas la dernière partie. Je pourrais faire un choix pour obtenir la liste des identifiants Foo que je veux, puis transmettre cela à Dapper Extensions, mais c'est moins efficace.
La partie que je ne peux pas faire avec Plain Dapper est d'obtenir automatiquement la liste de colonnes SELECT, donc ce que j'aimerais vraiment, c'est un moyen de: -
J'ai regardé le code, mais je ne vois pas comment faire ces choses. Quelqu'un peut-il aider? J'ai contourné en utilisant Dapper simple et "SELECT * ..." pour le moment, mais je suis sûr qu'il y a un meilleur moyen.
Je ne savais pas que ce n'était pas supporté en 2012. Donc, environ 1,7K vues en deux ans et pas beaucoup d'exposition. Mais si quelqu'un de nouveau chez Dapper a atterri ici et se demande si cela fonctionne, la réponse est que cela fonctionne. En utilisant la dernière version de, à ce jour, 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 });
}
Voici une autre option:
Vous pouvez créer une vue:
select * from Foo
join FooBar b
on a.foo_id = b.foo_id
Utilisez ensuite des prédicats pour sélectionner avec une clause 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();
}
Le SQL généré devrait ressembler à:
SELECT
[Foo].[foo_id]
, [Foo].[...]
, [Foo].[...]
, [Foo].[...]
, [Foo].[...]
FROM [ViewName]
WHERE ([ViewName].[foo_id] = @foo_id_0)