Wie verwende ich 'Where In' in Dapper

.net c# dapper orm sql

Frage

Ich habe seit einiger Zeit erfolglos versucht, eine IEnumerable<string> mit einer WHERE IN Klausel in Dapper zu verwenden.

In der Dokumentation heißt es, dass IEnumerable<int> für die Verwendung in einem WHERE IN aber ich kann das nicht einmal zum IEnumerable<int> bringen.

Dapper allow you to pass in IEnumerable<int> and will automatically parameterize your query.

Die Fehlermeldung, die ich weiterhin erhalte, ist ein SQL-Syntaxfehler. Incorrect syntax near ','.

Ich habe einen Testcode zusammengestellt, der hoffentlich zeigen wird, was ich erreichen möchte.


string connString = "Server=*.*.*.*;Database=*;User Id=*;Password=*;";

string sqlStringIn = @"SELECT StringText FROM 
                (SELECT 1 ID, 'A' StringID, 'This is a test' StringText
                UNION SELECT 2 ID, 'B' StringID, 'Another test' StringText
                UNION SELECT 3 ID, 'C' StringID, 'And another' StringText
                UNION SELECT 4 ID, 'D' StringID, 'and again' StringText
                UNION SELECT 5 ID, 'E' StringID, 'yet again' StringText) data
                WHERE StringId IN (@str)";

string sqlIntegerIn = @"SELECT StringText FROM 
                (SELECT 1 ID, 'A' StringID, 'This is a test' StringText
                UNION SELECT 2 ID, 'B' StringID, 'Another test' StringText
                UNION SELECT 3 ID, 'C' StringID, 'And another' StringText
                UNION SELECT 4 ID, 'D' StringID, 'and again' StringText
                UNION SELECT 5 ID, 'E' StringID, 'yet again' StringText) data
                WHERE ID IN (@integer)";


using (SqlConnection conn = new SqlConnection(connString))
{
    conn.Open();

    List<int> integers = new List<int>{ 1, 2, 3 };
    List<string> strings = new List<string> { "A", "B", "C" };

    var parameters = new {str = strings, integer = integers };

    //fails here
    IEnumerable<string> intTest = conn.Query<string>(sqlIntegerIn, parameters, commandType: System.Data.CommandType.Text);

    //and here
    IEnumerable<string> stringTest = conn.Query<string>(sqlStringIn, parameters, commandType: System.Data.CommandType.Text);

}

Akzeptierte Antwort

Um das zu tun, was hier benötigt wird, muss Dapper das SQL im laufenden Betrieb ändern - also muss es wirklich sicher sein, dass es das Richtige tut. Die reguläre gültige SQL-Syntax enthält Klammern:

WHERE StringId IN (@str)

Um von diesen Mehrdeutigkeiten, die Voodoo adrett Syntax läßt die Klammer:

WHERE StringId IN @str

Wenn dies erkannt wird, sucht es nach einem Parameter namens str und erweitert es auf einen der folgenden str :

WHERE 1=0 -- if no values
WHERE StringId = @str -- if exactly one value
WHERE StringId IN (@str0, @str1, ...) -- if more than one value

Aber kurze Version: Entfernen Sie die Klammer.


Beliebte Antwort

Ich möchte eine wichtige Anmerkung hinzufügen, wenn Sie daran interessiert sind, mit einer leeren Liste umgehen zu können, oder die IN Klausel optional . Ich tat dies, indem ich eine Eigenschaft hinzufügte, um die Zählung wie public int InClauseCount => InClauseList?.Length ?? 0; zu enthalten public int InClauseCount => InClauseList?.Length ?? 0;

Dann benutze die Anzahl innerhalb des Sql wie folgt ...

Select field1, field2
from Table1
where (some condition)
AND (@InClauseCount = 0 OR field1 IN @InClauseList)

Ich hoffe, dass das jemandem da draußen helfen kann. Ich habe etwas zu lange damit verbracht, dieses Problem zu lösen, teilweise weil ich Dapper neu bin.



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