2012-04-20 1 views
7

Использование Dapper, следующих бросков Incorrect syntax near ','.Dapper and In Condition

const string sql = 
    "select * from ZipToZipDistance z where z.NoRouteFound = 0" + 
    " and z.OriginZip in (@zips) or z.DestZip in (@zips)"; 
var zipStrings = zips.Select(x => x.ToString()).ToArray(); 
var result = connection.Query<ZipToZipDistance>(sql, 
    new { zips = zipStrings }); 

Хм, у SQL нет запятых. Он должен иметь какое-то отношение к параметру. OriginZip и DestZip: varchar(10). zips есть IEnumerable<int>. Я попытался использовать zips в качестве параметра без преобразования в строки. Такая же ошибка.

Кажется очень простым. Что я делаю не так?

+1

Снимите кронштейны из @zips – jaxxbo

+0

Had такая же проблема как раз сейчас, и я просто снял скобки/круглые скобки вокруг @zips. Просто як jaxxbo говорит. –

ответ

7

попробовать:

const string sql = 
const string sql = 
    "select * from ZipToZipDistance z where z.NoRouteFound = 0" + 
    " and z.OriginZip in @zips or z.DestZip in @zips"; 
var zipStrings = zips.Select(x => x.ToString()); 
var result = connection.Query<ZipToZipDistance>(sql, 
    new { zips = zipStrings }); 
+0

Сэма проблема, с которой я сталкиваюсь, заключается в том, что я могу передавать только 2100 элементов в предложении IN, которое, по-видимому, является ограничителем dapper, потому что когда я создаю запрос с помощью конкатенации строк, он работает просто отлично. Вот что я имею в виду: Рабочий код: var query = @ "SELECT * FROM QuestionTags WHERE QuestionID IN (" + idsCsvString + ")"; var results = conn.Query (query) .ToList(); – Marko

+0

Когда я делаю это так, как вы предлагаете, я получаю следующую ошибку: Неверный поток протокола исходящих вызовов (TDS) потока входящих табличных данных (TDS). Слишком много параметров было предоставлено в этом запросе RPC. Максимум 2100 – Marko