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