Angenommen, Sie haben eine SQL-Abfrage, die IN verwendet und Sie möchten es mit Dapper ausführen. Ihre Abfrage sieht in etwa so aus:
SELECT * FROM [Articles]
WHERE Author IN ('Bob', 'Alice')
Code language: SQL (Structured Query Language) (sql)
So würden Sie das mit Dapper ausführen:
static IEnumerable<Article> GetArticles(List<string> authors)
{
using (SqlConnection con = new SqlConnection(GetConnectionString()))
{
return con.Query<Article>("SELECT * FROM Articles WHERE Author IN @authors"
, new { authors=authors });
}
}
Code language: C# (cs)
Dann würdest du es so nennen:
var articles = GetArticles(new List<string>() { "Bob", "Alice" });
Code language: C# (cs)
Dabei sind zwei wichtige Dinge zu beachten:
- Sie müssen die Klammern ausschließen.
- Ich habe einen Parameter namens @authors angegeben und eine Liste von Autoren übergeben. Dapper weiß, wie man mit Listen umgeht.
Schließen Sie die Klammern aus
In einer normalen SQL-Abfrage müssen Sie Klammern mit IN verwenden. Aber wenn Sie die Abfrage mit Dapper ausführen, müssen Sie sie ausschließen.
Sehen Sie sich an, was passiert, wenn ich IN (@authors)
verwendestatic IEnumerable<Article> GetArticles(List<string> authors)
{
using (SqlConnection con = new SqlConnection(GetConnectionString()))
{
return con.Query<Article>("SELECT * FROM Articles WHERE Author IN (@authors)"
, new { authors=authors });
}
}
Code language: C# (cs)
Ich erhalte die folgende unverständliche Ausnahme:
Dies liegt daran, dass bei der Verwendung von IN mit Dapper automatisch Klammern für Sie eingefügt werden.
Es generiert etwas, das der folgenden SQL-Abfrage entspricht:
SELECT * FROM [Articles]
WHERE Author IN (('Bob', 'Alice'))
Code language: SQL (Structured Query Language) (sql)
Wenn Sie versucht haben, diese ungültige Abfrage in SSMS auszuführen, erhalten Sie den Fehler „Falsche Syntax in der Nähe von ‚,‘“.