2010-02-19 3 views
3

Linq를 사용하여 고객 및 인보이스가 포함 된 개체를 반환하고 싶습니다.여러 클래스를 IQueryable로 반환하는 방법 <T>

나는 방법에서 하나의 유형을 반환 이해 :

public IQueryable<customers> GetCustomers() 
{ 
    return from c in customers 
      select c; 
} 

을하지만 문제가 여러 개체를 알아내는 데 : 나는이 잘못된 방향으로 접근하고 느낌이

public IQueryable<???> GetCustomersWithInvoices() 
{ 
    return from c in customers 
      from inv in c.invoices 
      select new {c, ci} // or I may specify columns, but rather not. 
} 

합니다. 목표는 컨트롤러에서 이러한 객체를 호출하여 직접 또는 formViewModel 클래스를 사용하여 뷰에 전달하는 것입니다.

+0

가능한 중복 [Return anonymous type?] (http://stackoverflow.com/questions/534690/return-anonymous-type) – nawfal

답변

1

두 번째 경우에는 메서드 범위가있는 익명 형식을 만듭니다. 메서드 경계 외부에 익명 형식을 전달하려면 반환 형식을 object로 변경해야합니다. 그러나 이것은 익명 형식의 목적을 상실합니다 (강력한 형식 지정을 잃어 버릴 때). 해당 형식에 대한 속성 및 값에 액세스하기 위해 리플렉션을 요구합니다.

이 구조를 반환 유형으로 유지하려면 고객 및 송장 값을 보유하는 속성으로 구성된 클래스 또는 구조체를 만들어야합니다.

+0

그건 이제는 이름이 맞습니다. :) – Brettski

+0

으로 반환되는 클래스를 생성했습니다. 나는 그것을 좋아하지 않는다. 나는 오히려 객체를 반환하고 customer.invoices.invoiceid 등을 사용하여 데이터를 얻는다. 이것은 지저분 해 보인다. – Brettski

+0

어쨌든 그렇게 할 수 있어야합니다. 고객 객체를로드 할 때 송장을 포함하도록 DataContext를 열 때 DataLoadOptions를 지정하기 만하면됩니다. http://msdn.microsoft.com/en-us/library/system.data.linq.dataloadoptions.loadwith.aspx를 참조하십시오. –

1

함수에서 익명 형식을 반환 할 수 없으며 엄격히 "인라인"클래스입니다. 함수에 캡슐화하려는 경우 멤버를 보유 할 구체적인 유형을 만들어야합니다.

위에서 언급 한 것처럼 뷰 모델을 사용하면 뷰 모델을 배치하는 것이 좋습니다.

Here은 익명 유형에 대한 scottgu 기사입니다.

익명 형식을 간결하게 명시 적 유형의 공식 클래스 선언을 제공하기 위해 을하지 않고, 코드 내 인라인 CLR 유형을 정의하는 개발자 수 있도록 편리한 언어 기능은 다음과 같습니다 기사의 결론에서. 그들은 많은 시나리오에서 사용할 수 있지만 LINQ를 쿼리 및 변환/형성 할 때 특히 유용합니다.

해당 페이지의 댓글 스레드에는 좋은 토론이 있습니다.

+0

기술적으로 함수의 반환 형식을'object' 또는'IEnumerable '그리고 그것은 효과가있을 것이다.당신이 결과에 유용한 어떤 것을 할 수 있는지 여부는 논쟁의 여지가 있습니다. –

+0

그게 바로 제가 고심하고있는 것입니다. 고객과 송장을 데이터베이스에서 쿼리하고, 보내고, 웹 페이지로 반복하고 싶습니다. 이것은 복잡하지 않아야합니다. – Brettski

0

정말로 원한다면이 작업을 수행 할 수 있지만 다소 어색합니다. 이런 식으로 var exampleObject = new {
Customer c = new Customer(),
Invoice i = new Invoice()
};

var returnedObjectOfAnonymousType = GetCustomersWithInvoices(exampleObject);

public IQueryable<T> GetCustomersWithInvoices(T exampleObject)
{
return from c in customers
from inv in c.invoices
select new {c, ci} // or I may specify columns, but rather not.
}

, 당신은 익명 형식을 반환하는 당신의 방법을 얻기 위해 타입 추론을 활용할 수 있습니다. 예제 객체를 전달하기 위해이 추악한 메소드를 사용해야한다. 나는 당신이 이것을하는 것이 정말로 권장하지 않지만, 이것이 이것이 할 수있는 유일한 방법이라고 생각합니다.

관련 문제