2015-02-24 40 views
0

我使用下面的代碼首先使用聯查詢內部錯誤使用C#轉換字符串GUID

void IRepository<T>.Delete(params Guid[] ids) 
    { 
     var sql = string.Format("UPDATE {0} SET [IsDeleted] = 1 WHERE [Id] IN (@ids) ", GetTableName()); 
     string sep = String.Join(", ", ids.Select(x => "'" + x + "'")); 
     var sqlParams = new Object[] 
     { 
      new SqlParameter("ids", string.Join(",",sep)), 
     }; 
     DataContext.Database.ExecuteSqlCommand(sql, sqlParams); 
    } 

現在通過EF代碼執行刪除操作,當我執行命令它給了我

conversion failed when converting from a character string to uniqueidentifier 

錯誤。

Hiwever當我在sql中運行查詢說。

UPDATE [dbo].[Table] SET [IsDeleted] = 1 WHERE [Id] IN ('20Cr0BCA-6EBB-E411-A04B-BC305BA8C713','506c79c1-6ebb-e411-a04b-bc305ba8c733') 

它工作正常。

這樣做有可能嗎?或者我做錯了什麼?

+0

不能使用'IN'具有可變。有關更多信息,請參閱http://stackoverflow.com/questions/337704/parameterize-a-sql-in-clause。 – 2015-02-24 13:14:28

+0

我認爲問題出在這個GUID上:'20Cr0BCA-6EBB-E411-A04B-BC305BA8C713'。一個GUID不能包含一個「r」,因爲它是由十六進制數字組成的 – 2015-02-24 14:08:48

+0

對不起我的不好..那肯定是一個排字錯誤 – 2015-02-24 14:20:17

回答

1

我會做這樣的事情

void IRepository<T>.Delete(params Guid[] ids) 
{ 
    if (ids == null || !ids.Any()) 
     return; 
    var idParams = ids.Select((x, cnt)=> new { ParamName ="@ids"+ cnt, Param = x}); 
    var sql = string.Format("UPDATE {0} SET [IsDeleted] = 1 WHERE [Id] IN ("+ String.Join(", ",idParams.Select(x => x.ParamName)) + ") ", "Table"); 
    var sqlParams = idParams.Select(x=> new SqlParameter(x.ParamName, x.Param)).ToArray(); 
    DataContext.Database.ExecuteSqlCommand(sql, sqlParams); 
} 
+0

從字符串轉換爲uniqueidentifier時,仍然出現轉換失敗。執行它:(@tyy – 2015-02-24 14:03:43

+0

只是做到了:)工程很酷 – 2015-02-24 14:06:32