2009-05-06 3 views
3

LINQ 쿼리에서 반환 된 익명 형식의 목록에서 n 번째 요소를 가져 오려고합니다. 여기서 n은 0에서 100까지의 임의의 숫자입니다. 지금은 잠시 들러서 아무데도 못갑니다. . 내 코드 (이름은 IP를 보호하기 위해 변경) :쿼리가 익명 형식을 반환 할 때 LINQ에서 가져 오기를 사용할 수 있습니까?

var query = from Table1 t1 in theContext.Table1 
    join Table2 t2 in theContext.Table2 
    on ... 
    where ... 
    select new 
    { 
     partNum = t1.part_number, 
     partSource = t2.part_source 
    } 

int num = new Random().Next(0, 100); 

// here's where the code I've tried fails 

은 어떻게 든 partNum와 partSource 단일 익명 형식을 얻기 위해 Take<T>(100).ToList<T>()[num]을 할 수 있습니까? 나는 유형을 명시 적으로 정의함으로써이를 해결했지만, 여기서는 좀 더 우아한 해결책을 놓친 것처럼 보였다. 내가하고 싶은 일은 호출자에게 Dictionary<string, string>을 반환하는 것이므로이 메서드 외부에 형식을 정의하지 않아도됩니다.

업데이트 : ElementAt가 작동하지 않습니다. 나는 추가 시도 :

// get a random part from the parts list 
int num = new Random().Next(0, query.Count() - 1); 
var nthElement = query.ElementAt(num); 

을 그리고 난 예외를 가지고 : The query operator 'ElementAt' is not supported.

답변

6

당신은 사용할 수 있어야합니다 :

var item = query.Take(100).ToList()[num]; 

물론, 어떻게하는 것이 더 효율적이 될 것이다 :

var item = query.Skip(num).First(); 
+0

여기에 뭔가가 빠졌습니까? 그는 단지 ElementAt 함수를 사용하고 싶지 않습니까? – Noldorin

+0

(응답으로 다른 응답으로 표시) –

+0

ElementAt가 반환합니다. "ElementAt가 지원되지 않습니다. ... System.Data.Linq.SqlClient.QueryConverter.VisitSequenceOperatorCall (MethodCallExpression mc)" – jcollum

3

나는 단지 ElementAt 확장 방법을 원한다고 생각합니다 :

var nthElement = query.ElementAt(num); 

확실히 ToListTake 쿼리 또는, 그리고 엉망 필요가 없습니다.

+0

내 대답에 대한 귀하의 의견; 내 첫 번째 예 (Take/ToList)는 그의 시도가 어떻게 고쳐질 수 있는지 보여주기위한 것이었다. 첫 번째()와 ElementAt (...) 중에서 선택해야 할 부분이별로 없으며 이미 +1을주었습니다 .-p –

+0

@Marc : 예, 그의 Take/ToList 사용. (나는 아직 보지 못했던 당신의 대답이 아니라 그의 질문에 순전히 답장을하고 있었다.) 사실 스킵과 퍼스트를 사용하는 것은 단지 불필요한 정교화 일 뿐이다 ... – Noldorin

+0

아니, 나는 ElementAt를 시도했는데 작동하지 않았다. : "쿼리 연산자 ElementAt가 지원되지 않습니다." – jcollum