C# – Verwendung von IN mit Dapper

C# – Verwendung von IN mit Dapper

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:

  1. Sie müssen die Klammern ausschließen.
  2. 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)

verwende
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)

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 ‚,‘“.