2012-01-09 2 views
0

엔티티 프레임 워크 연결을 사용하여 MyTbl이라는 테이블에서 XML 문자열 목록을 추출하는 데 사용되는 IDsList라는 정수 목록이 있습니다. 그런 다음 XML 문자열을 사용하여 다른 작업을 수행합니다. 다음 중 어느 것이 더 좋을까요?루프 내의 엔티티 프레임 워크 연결

방법 1

var IDsList = new List<Int32>() {17, 23, 47, 62, 63, 79, 85, 91, 100}; // user input 
List<String> XMLStrs = null; 
using (var ctx = new DatabaseEntities()) { 
    XMLStrs = IDsList.Select (i => Ctx.MyTbl.First (tr => tr.id == i).xml_str).ToList(); 
} 
XMLStrs.AsParallel().ForAll (xs => { 
    // Do something in parallel 
}); 

방법 2

var IDsList = new List<Int32>() {17, 23, 47, 62, 63, 79, 85, 91, 100}; // user input 
IDsList.AsParallel().ForAll (i => { 
    using (var ctx = new DatabaseEntities()) { 
     var xs = ctx.MyTTbl.First (tr => tr.id == i).xml_str; 
     // Do something with xs 
    } 
}); 

이상의 관용적 C 번호는 다른 방법이 있는가?

IDList는 일반적으로 길이가 더 긴 목록으로, 일반적으로 수천 개에 이릅니다. 그리고 xs의 특정 값에 대한 각각의 개별 실행은 대략 다른 시간만큼 소요됩니다. 당신이 EF 4.1의 IDsList에 존재하는 ID를 가지고있는 행을 얻으려고 노력하는 경우

+0

프로세스 # 2가 매우 많은 양의 데이터베이스 연결을 생성하여 본질적으로 일부 네트워크에서 DOS 필터를 트리거 할 수 있습니다. – doogle

답변

0

, 당신은 당신의 쿼리에서 .Contains을 사용할 수 있습니다 : 당신은 선호도에 따라주의해야

var IDsList = new []{17, 23, 47, 62, 63, 79, 85, 91, 100}; // user input 
List<string> XMLStrs = null; 
using (var ctx = new DatabaseEntities()) 
{ 
    XMLStrs = (from tr in Ctx.MyTbl 
       where IDsList.Contains(tr.id) 
       select tr.xml_str).ToList(); 
} 
+1

나는 OP가 구체적으로 병렬 LINQ에 대해 묻고 있다고 생각한다. – Yuck

+0

그의 질문은 그의 목록 "IDList"의 정수 값으로 지정된 데이터베이스에서 행을 가져 오는 문제를 구체적으로 나타내고있다. – doogle

+0

아니요 ... 질문에는 ID 값의 * 매우 큰 목록 *과의 일치가 포함됩니다. 따라서 병렬 처리. 'Contains() '를 사용하는 것이 SQL에서'IN'으로 변환하는 적절한 방법이지만, PLINQ를 사용하는 방법은 무엇이 가장 중요한가입니다. – Yuck