2016-08-15 6 views
0

Я искал эту проблему, но я думаю, что кто-то столкнулся с ней. Я пытаюсь использовать операцию IN с ExecuteQuery.C# ExecuteQuery: Как использовать оператор IN?

IEnumerable<TAssets> results = db.ExecuteQuery<TAssets> 
("SELECT * FROM TAssets " + 
" WHERE AssetId not in (select MatchedAssetId from TMatches where LabelId = {0})" + 
"  and CompanyId in ({1}) ", 
labelid, 
string.Join(",", companyIdList) 
); 
return results.ToList(); 

Проблема заключается в string.join ("", companyIdList) возвращается '61, 70' . Затем он пытается преобразовать его в целое. Зачем? Что я должен делать?

ERROR:Conversion failed when converting the nvarchar value '61,70' to data type int. 
System.Data.SqlClient.SqlException (0x80131904): Conversion failed when converting the nvarchar value '61,70' to data type int. 
    at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 
    at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 
    at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) 
    at System.Data.SqlClient.SqlDataReader.TryHasMoreRows(Boolean& moreRows) 
    at System.Data.SqlClient.SqlDataReader.TryReadInternal(Boolean setTimeout, Boolean& more) 
    at System.Data.SqlClient.SqlDataReader.Read() 
    at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReaderBase`1.Read() 
    at System.Data.Linq.SqlClient.ObjectReaderCompiler.ObjectReader`2.MoveNext() 
    at System.Collections.Generic.List`1..ctor(IEnumerable`1 collection) 
    at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source) 

Любые предложения? Или вы можете показать мне использование оператора IN с помощью ExecuteQuery?

+0

я может отсутствовать что-то очевидное, но то, что ваш 'db' объект в этом случае, и то, что' ExecuteQuery'-метод вы используете? Это не часть 'SqlCommand' или' DbContext'. – smoksnes

+0

Как и большинство языков, SQL интерпретирует строку * single *, которая имеет значение *, содержит * цифры и запятые, а не * несколько * параметров. –

+0

@smoksnes db - System.Data.Linq.DataContext. Возможно, я ошибаюсь, используя функцию ExecuteQuery. – akdora

ответ

0

Заявление вы строите приводит к:

"SELECT * FROM TAssets WHERE AssetId not in (select MatchedAssetId from TMatches where LabelId = 1) and CompanyId in ('61,70')" 

Вы должны интерпретировать каждое значение отдельно, чтобы ваш выход, как:

"SELECT * FROM TAssets WHERE AssetId not in (select MatchedAssetId from TMatches where LabelId = 1) and CompanyId in ('61','70')" 

эта линия

string.Join("','", companyIdList) 

В комбинации с ведущими и заканчивающимися »должен делать трюк.

Лучше всего было бы динамические созданные SqlParameters хотя

+0

Это была хорошая попытка, но это не сработало. Прости. Ошибка. Ошибка конверсии при преобразовании значения nvarchar '61', '70' в тип данных int. – akdora

1

Дело в том, что они параметрируются, которые, как правило, это хорошая вещь.

Я не говорю, что это лучшее из решений, но вы должны быть в состоянии сделать что-то вроде этого:

// Note that the first {} is escaped. 
var sql = string.Format(
        "SELECT * FROM TAssets WHERE AssetId not in (select MatchedAssetId from TMatches where LabelId = {{0}}) and CompanyId in ({0})", 
        string.Join(",", companyIdList)); 
IEnumerable<TAssets> results = db.ExecuteQuery<TAssets>(sql, labelid); 
return results.ToList(); 

Что это на самом деле делает то, что он добавляет companyIds в строку SQL вместо того, чтобы позволить ExecuteQuery параметризуйте его. Просто остерегайтесь инъекций sql и убедитесь, что у вас есть только int в вашем companyId массиве.

sql -переменную будет:

SELECT * FROM TAssets WHERE AssetId not in (select MatchedAssetId from TMatches where LabelId = {0}) and CompanyId in (61,70) 
+0

Я знаю, что это не лучшее решение, но оно сработало. Спасибо – akdora