을 사용하여 INSERT INTO ... SELECT 수행 LINQ to SQL을 사용하여 "into ... select"형식 명령을 수행 할 수 있는지 파악하려고합니다. LINQ to SQL 코드를 사용하면 주어진 테이블에 여러 행을 삽입하는 단일 SQL 명령을 데이터베이스에 보낼 수 있습니다.LINQ to SQL
예를 들어, LINQ to SQL을 작성하는 방법은 다음 T-SQL 문을 SQL Server 데이터베이스로 보냅니다.
INSERT INTO Table1
SELECT Table2.column1 + 1 AS column1, Table2.column2 + 2 AS column2
WHERE Table2.column3 > 100
나는 물론 DataContext.ExecuteCommand
기능을 사용하여이를 달성 할 수 있지만, 이것은 당신이 DataContext.SubmitChanges
으로 얻을 처리 자동 트랜잭션을 활용하지 않고 즉시 실행됩니다. 이 업데이트 외에 일련의 업데이트가 있으며 오류가 발생하면 롤백해야합니다.
아이디어가 있으십니까?
UPDATE : 여기에 실제 코드는 다음과 같습니다
var bs_prep =
from b in dc.T_EDR_FILEBODies
join
unpaid in dc.V_UNPAIDs
on
b.NUM_ADC.Substring(1, 9) equals unpaid.NOCONT
join
acordo in dc.T_ACORDOS_RECOM_APREs
on
Convert.ToInt32(b.NUM_ADC.Substring(1, 9)) equals acordo.ID_Contrato
where
b.ID_EDR == id_edr
&&
(
unpaid.NUM_INCUMPRIMENTOS <= max_unpaid_consec
&&
unpaid.TOTAL_NUM_INCUPRIMENTOS <= max_unpaid_nonconsec
)
||
(
acordo.Activo == true
&&
acordo.Data_Recomeco <= now
)
select new
{
ID_EDR = id_edr_filt,
NUM_LINHA = b.NUM_LINHA,
CODREJ = b.CODREJ,
HDT = b.HDT,
IMPORT = b.IMPORT,
NIB_DEV = b.NIB_DEV,
NUM_ADC = b.NUM_ADC,
REF_DD_BC = b.REF_DD_BC,
REF_MOV = b.REF_MOV
}
;
dc.T_EDR_FILEBODies.InsertAllOnSubmit(
bs_prep.Select(
b => new T_EDR_FILEBODY{
CODREJ = b.CODREJ,
HDT = b.HDT,
ID_EDR = b.ID_EDR,
IMPORT = b.IMPORT,
NIB_DEV = b.NIB_DEV,
NUM_ADC = b.NUM_ADC,
NUM_LINHA = b.NUM_LINHA,
REF_DD_BC = b.REF_DD_BC,
REF_MOV = b.REF_MOV
}
)
);
빠른 설명 : T_EDR_FILEBODies
개체는 기본적으로 우리가 가져올 텍스트 파일의 내용을 저장하는 데이터베이스 테이블에 매핑됩니다. 하나의 레코드는 텍스트 파일의 한 줄에 해당합니다.
내가하려는 것은 파일의 레코드를 하나의 파일에서 복사하여 새로운 파일 ID (ID_EDR=id_edr_filt
)를 제공하지만 일부 줄을 필터링하여 파일 내용의 필터링 된 버전을 만드는 것입니다. LINQ to SQL 엔터티는 데이터베이스 테이블에 직접 매핑됩니다. 지금까지 datacontext에 코드를 추가하지 않았습니다. 그들은 기본 키를 가지고, 그렇지 않으면 내가 그들에 삽입을 할 수 없을 것입니다 (나는 어딘가에 내가 기본 키를 없애면 그 예외를 제거 할 수있을 것이라고 읽을 수 있지만 볼 수 있듯이, 그것은 내 경우에는 작동). 개체 유형 쿼리에 'T_EDR_FILEBODY'의
명시 건축이 허용되지 않은 : 나는 그것을 실행하면
나는
InsertAllOnSubmit
에 의해 슬로우 다음과 같은 예외를 얻을.
쿼리 내부에 명시 적으로 엔티티를 구성하는 것이 문제가 될 것이라고 생각합니다. 쿼리에 의해 리턴 된 엔티티는 변경 추적을 가지며, 변경 사항은 submitchanges가 호출 될 때 데이터베이스로 변환됩니다. 그러나 클라이언트 측에서 생성 된 엔티티의 변경 사항을 어떻게 데이터베이스로 변환 할 수 있습니까? 그러나 이것은 정말로 당신이 LINQ to SQL을 사용하여 INSERT INTO ... SELECT 타입 명령을 수행 할 수 없다는 것을 의미합니까?
당신이 할 수를 상기 ExecuteCommand를하고 그 안에 어떤 다른 사람을 "새 TransactionScope에로 _tx 사용()"및 포장? – StingyJack
글쎄, 내가 할 수있는 것 같아요, 그리고 난 그냥 까다롭게 수 있지만 난 당신이 그냥 ... linq를 사용하여 성명을 삽입을 할 수 없다는 것을 받아 들일 것을 발견. 그것은 거대한 handycap 일 것입니다. –