2013-05-22 87 views
0

我試圖刪除EF5多行,我用下面的代碼示例實體框架中刪除多行

string TestId = "12,23"; 
Context.Database.ExecuteSqlCommand("DELETE FROM TEST WHERE TESTID IN (@Params)", new SqlParameter("Params", TestId)); 

我如何通過SqlParameterIN?我試圖通過逗號分隔值

感謝

回答

0

的唯一方式的字符串,你可以通過在SQL查詢TESTID IN (...)部分是使用子查詢值的動態數量。這適用於SQL查詢本身,因此沒有可以解決您的問題的參數類型。

您的替代方案是通過使用字符串連接並仔細驗證每個參數來動態構建查詢。

由於您使用的ID可能是整數。

List<int> testId = ...; 
var sb = new StringBuilder(); 
sb.Append("DELETE FROM TEST WHERE TESTID IN ("); 
bool first = true; 
foreach (var i in testId) 
{ 
    if (first) 
     first = false; 
    else 
     sb.Append(","); 
    sb.Append(i.ToString(CultureInfo.InvariantCulture)); 
} 
sb.Append(")"); 
Context.Database.ExecuteSqlCommand(sb.ToString()); 

由於沒有正被添加到查詢你從任何SQL注入安全字符串參數 - 也沒有辦法整數將包含惡意SQL代碼。

當ID數量非常大(以便查詢在編譯期間過長時,查詢失敗)的常用方法是創建一個臨時表並在其中插入ID。

另一種方法是傳入格式爲XML的值,並在SQL查詢中寫入從XML字符串中檢索它們的子查詢。

+1

所以最好我可以刪除使用LINQ到實體而不是這種方式?爲了避免我使用這個。有什麼建議麼 ? – Peru

+0

我通常只在有大量要刪除的實體時才這樣做。傳統的EF方法需要一個SELECT,然後是DELETE。你可能會首先看到'Context.Tests.Local.FirstOrDefault(o => o.id == x)'返回null('.Local'只包含已經存在於內存中的對象) - 如果沒有,則使用EF刪除,否則直接在SQL中刪除。 –