Anpassen von SQL mit Dapper-Erweiterungen

c# dapper micro-orm orm

Frage

Ich verwende Dapper-Erweiterungen für einige meiner Typen und es funktioniert wirklich gut für die meisten Anwendungsfälle. Ich bin auf einen Fall gestoßen, in dem ich eine Viele-Viele-Beziehung habe, und ich möchte etwas tun wie:

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

Offensichtlich können Dapper Extensions "SELECT id, a, b, c VON Foo" handhaben, aber nicht den letzten Teil. Ich könnte eine Auswahl treffen, um die Liste der Foo-IDs zu erhalten, die ich möchte, und dann an Dapper Extensions weiterleiten, aber das ist weniger effizient.

Der Teil, den ich mit normalem Dapper nicht machen kann, ist, die SELECT-Spaltenliste automatisch zu bekommen, also was ich wirklich möchte, ist ein Weg zu:

  • Holen Sie die SELECT-Spaltenliste aus den internen Mechanismen von Dapper Extension
  • Holen Sie sich die grundlegenden "SELECT-ID, a, b, c FROM Foo" von Dapper Extension internen Mechanismen
  • Hook Dapper-Erweiterungen Holen Sie Code, damit ich eine benutzerdefinierte WHERE-Klausel hinzufügen kann

Ich habe mir den Code angeschaut, aber ich kann nicht erkennen, wie ich all diese Dinge machen soll. Kann jemand helfen? Ich habe im Moment mit dem einfachen Dapper und "SELECT * ..." gearbeitet, aber ich bin mir sicher, dass es einen besseren Weg gibt.

Akzeptierte Antwort

Ich wusste nicht, dass dies nicht im Jahr 2012 unterstützt wurde. Also etwa 1.7K Ansichten in zwei Jahren und nicht viel Exposition. Aber falls jemand, der neu bei Dapper ist, hier gelandet ist und sich gefragt hat, ob es funktioniert, lautet die Antwort: Es funktioniert. Unter Verwendung der neuesten Version von, wie dieses Schreiben, Dapper v1.42 von 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 });
}

Beliebte Antwort

Hier ist eine weitere Option:

Sie können eine Ansicht erstellen:

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

Verwenden Sie dann Prädikate, um mit einer where-Klausel auszuwählen:

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

Generiertes SQL sollte etwa so aussehen:

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum