2013-08-28 3 views
3

저는 postgresql 데이터베이스를 가지고 있으며 가능한 한 적은 수의 쿼리에서 테이블에서 여러 행을 제거하려고합니다. 따라서 루핑은 좋은 옵션이 아닙니다. postgres 드라이버에 NPGSQL을 사용하고 있습니다.WHERE IN 절을 사용하여 PostgreSQL에서 Entity Framework로 여러 행을 삭제합니다.

아래 코드는 있지만 작동하지 않습니다.

 string[] namesToDelete = PromosReplies. 
         PromosRepliesLoaded.GroupBy(pr => pr.Name). 
         Select(r=>r.Key).ToArray(); 
     long[] repliesIdsToDelete = context.PromosReplies. 
            Where(pr => namesToDelete.Contains(pr.Name)). 
            Select(r => r.Idx).ToArray(); 
     if (repliesIdsToDelete.Length > 0) 
     { 
      foreach (var name in namesToDelete) 
      { 
      context.Database.ExecuteSqlCommand("DELETE FROM messages WHERE name = {0}", name); 
      } 
      string idToDelete = String.Join(",", repliesIdsToDelete); 
      int result = context.Database.ExecuteSqlCommand(
       "DELETE FROM message_translations WHERE idx IN ({0})", 
       repliesIdsToDelete); 

은 내가 "정수에 대한 잘못된 입력 구문 : : : 22P02 ERROR"를 얻을 오류를 마지막으로 쿼리를 실행하려고 할 때. 이것을 극복 할 수있는 방법이 있습니까? 그렇다면 문자열을 사용해야하는 첫 번째 delete 문을 사용하여 비슷한 작업을 수행 할 수 있습니까?

답변

4

갱신 나는 EF와 협력, 그러나 여기 Npgsql에 매개 변수로 배열을 사용하는 방법 아니에요 :

var cmd = NpgsqlCommand(); 
cmd.CommandText = "select * from test where id = any(@list)"; 
cmd.Connection = "**************************"; 
cmd.Parameters.Add("list", NpgsqlDbType.Array | NpgsqlDbType.Integer); 
cmd.Connection.Open(); 
var r = cmd.ExecuteReader(); 

그래서 내가 EF의 가정은 법한 :

var par = new NpgsqlParameter("list", NpgsqlDbType.Array | NpgsqlDbType.Text); 
var par.Value = namesToDelete; 
int result1 = context.Database.ExecuteSqlCommand(
    "DELETE FROM messages WHERE name = any(@list)", 
    par 
); 

old SQL 삽입으로 이어질 수 있기 때문에 전혀 좋아하지 않습니다.

,210
int result1 = context.Database.ExecuteSqlCommand(
    String.Format(
     "DELETE FROM messages WHERE name in ({0})", 
     String.Join(",", namesToDelete.Select(x => "'" + x + "'")) 
    ) 
); 

int result2 = context.Database.ExecuteSqlCommand(
    String.Format(
     "DELETE FROM message_translations WHERE idx in ({0})", 
     String.Join(",", repliesIdsToDelete) 
    ) 
); 

내가 EntityFramework의 전문가가 아니지만, 당신이 context.Database.ExecuteSqlCommand(command, str)를 사용할 때 내가 생각 str을 매개 변수로 사용되므로 명령이 DELETE FROM message_translations WHERE idx in ('1, 2, 3, 4')된다 (작은 따옴표에 유의 '1, 2, 3, 4'는 서버 측에서 문자열 사실이다).

DB가 SQL 서버 인 경우 테이블 반환 매개 변수를 사용할 수 있습니다. 매개 변수로 배열을 PostgreSQL에 전달할 수 있습니다. 나중에 시도해야합니다.

+0

같은 오류가 발생했습니다. = 기호는 내 부분의 오타였습니다. – idipous

+0

@idipous 문자열 (목록이 아님)을 전달하려고 시도 했습니까? 대답을 바 꾸었습니다. –

+0

@idipous는'string.format'을 시도 할 수 있습니까? –

관련 문제