Personnalisation de SQL avec les extensions Dapper

c# dapper micro-orm orm

Question

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: -

  • Récupère la liste des colonnes SELECT des mécanismes internes de Dapper Extension
  • Obtenir le "SELECT ID, a, b, c FROM Foo" de base à partir des mécanismes internes de Dapper Extension
  • Extensions Hook Dapper Récupère le code pour que je puisse ajouter une clause WHERE personnalisée

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.

Réponse acceptée

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

Réponse populaire

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)



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