2009-12-02 1 views
4

그래서이 LINQ 쿼리는 다음과 같이 사용자 지정 select에서 끝납니다.특정 유형의 IQueryable을 반복할까요?

select new { this1 = table.this1, this2 = othertable.this2 } 

컨트롤러에서이 쿼리를 호출하면 다음과 같이 보입니다.

ViewData["these"] = theRepo.GetAllThese(someVar, anotherVar); 

이제 이것을 전달하면 내 견해로 강하게 입력되지 않았기 때문에 foreach를 사용하여 어떻게 반복 할 수 있습니까? Iqueryable 또는 List로 캐스팅 할 수 있습니까?

...이게 뭔가?

IQueryable<???> these = ViewData["These"]; 
foreach (var this in these) {... 

'???'에 넣을 내용을 알아야합니다. 나는 생각한다.

+1

'var these = ...'? –

+0

var는 결코 반환 유형이 될 수 없습니다 :) – Webleeuw

+0

'GetAllThese()'의 returntype은 무엇입니까? –

답변

1

linq 쿼리는 익명으로 형식이 지정된 개체의 컬렉션을 반환합니다. 익명으로 명시 적으로 입력 된 변수를 선언 할 때 "이름을 부르는"방법이 없습니다. 따라서 객체의 실제 유형/모양은 객체가 정의 된 동작 메소드에서만 알 수 있습니다.

ViewData 개체의 인덱스 게터는 object의 반환 유형을 가지고 있으며, 유형 이름을 모르고, 당신은 아무것도 유용에 ViewData["these"]의 반환 값을 캐스팅 할 수 있어야합니다.

당신이 대신 수행 할 수 있습니다 무엇, 모델을 만드는 것입니다 - 더 구체적으로 "view model" - 당신이 LINQ 사용하여 선택하는 오브젝트의 구조를 정의하는 다음을 수행 할 쿼리를

public class FoobarViewModel 
{ 
    public string Foo { get; set; } 
    public string Bar { get; set; } 
} 

과 재정을

select new FoobarViewModel { foo = table.this1, bar = othertable.this2 } 

귀하의 객체가 이제 공통 이름 클래스를 공유하고 컬렉션은 쉽게보기에 적절한 형태로 주조 할 수있다 : 다음과 같이 선택합니다.

2

정의 된 범위 밖에서 익명 형식 (새로운 {속성 = 값} 선택)을 사용할 수 없습니다. 그래서 당신은 메서드 내에서 당신이 쿼리를 정의에서 ({yourQueryHere}에 var에 x)는 foreach 문을 사용한다

예 :. 이 가능하다 :

public void myMethod() { 
     var x = from c in IEnumerable select new { Prop = value }; 
     foreach (var y in x) { 
     } 
    } 

이 불가능하다 :

public void myMethod() { 
     foreach (var y in myMethod2()) { 
     } 
    } 

    public IQueryable<???> myMethod2() { 
     return from c in IEnumerable select new { Prop = value }; 
    }