2010-04-25 4 views
5

그렇기 때문에 고객 개체 모델을 사용하는 강력한 형식의 고객 "세부 정보"보기가 있습니다.ASP.NET MVC/LINQ :보기에서 Linq.EntitySet을 반복하는 적절한 방법은 무엇입니까?

저는 LINQ to SQL을 사용하고 있으며 모든 고객은 여러 개의 (주차) 공간을 가질 수 있습니다.

내 LINQ 생성 고객 모델에 "공간"컬렉션이 있으므로 데이터베이스에서 FK 관계입니다. 큰!

public void Delete(Customer customer) 
{ 
    foreach (Space s in customer.Spaces) 
     db.Payments.DeleteAllOnSubmit(s.Payments); 
    db.Spaces.DeleteAllOnSubmit(customer.Spaces); 
    db.Customers.DeleteOnSubmit(customer); 
} 

모두가 예상 작품과 같이

여기에 다음 마지막으로 고객의 모든 지불 공백을 삭제하는 내가 고객의 주차 공간을 반복 내 CustomerRepository에서 코드입니다! 나는 다음과 같은 오류 얻을

<% foreach (var s in Model.Spaces) 
    { %> 
    <tr> 
     <td><%: s.ID %></td> 
     <td><%: s.InstallDate %></td> 
     <td><%: s.SpaceType %></td> 
     <td><%: s.Meter %></td> 
    </tr> 
<% } %> 

: 마지막으로

foreach statement cannot operate on variables of type 'System.Data.Linq.EntitySet' because 'System.Data.Linq.EntitySet' does not contain a public definition for 'GetEnumerator'

를 내가의이 비트를 추가하는 경우

지금 내 "세부 사항"보기에 나는 고객의 스페이스와 테이블을 채우려 코드를 내 고객 부분 클래스에 추가하고 뷰에서 foreach를 사용하여 모든 정보가 예상대로 작동하는지 확인하십시오.

public IEnumerable<Space> ParkingSpaces 
{ 
    get 
    { 
     return Spaces.AsEnumerable(); 
    } 
} 

여기에서 문제는 내가 반복하고 싶지 않다는 것이다. ViewModel을 사용하여 View에 공간 컬렉션을 전달할 수도 있다고 생각했지만 LINQ는 이미 고객 모델에 Spaces 속성을 유추하고 생성하므로 사용하는 것이 가장 깨끗합니다.

나는 간단한 것을 놓치고 있습니까? 아니면 잘못 접근하고 있습니까?

감사합니다.

+0

보기가'IEnumerable '에 강력하게 입력 되었습니까? 그렇지 않은 경우에는 아마 도우미 코드 없이도 열거 할 수 없습니다. –

+0

내보기에 강력하게 형식이 지정되어 있습니다. Inherits = "System.Web.Mvc.ViewPage " 아마도 명확하지 않지만 뷰는 고객의 계정 정보를 제공합니다. 고객은이 페이지에도 표시되어야하는 수의 공간이 있습니다. 따라서 Spaces의 목록 만 있으면 좋겠다. 고객의 공간을 포함하여 고객 계정에 대한 세부 정보를 원한다. –

답변

14
그것을 통해 반복 할 수

죄송 합니다만 조금 늦게 대답하지만 문제를 해결하는 올바른 방법은 뷰가 GetEnumerator() 메서드에 액세스 할 수 있도록 web.config 파일에 어셈블리 참조를 추가하는 것입니다. 페이지 합병 오류에서 제공된 어셈블리 참조 문자열을 사용하여이 작업을 수행 할 수 있습니다. 예를 들어

<add assembly="System.Data.Linq, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>

+0

이것이 저에게 효과적입니다. – Rob

+0

이것도 나를 위해 일한, 바보 같은데 그것은 기본적으로 발생하지 않습니다 –

+0

면접 시험원 엔진을 사용하여 ASP.Net MVC 웹 응용 프로그램이 주어진이 대답은 어떻게 바뀌겠습니까? – beaudetious

1

작은 도우미 방법 외에는 두 가지 방법이 있습니다.

당신은 페이지 클래스의는 IEnumerable을 상속 할 수

:

<%@ Page Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<IEnumerable<Space>>" %> 

<% foreach (var item in Model) 
    { 

아니면를 IEnumerable 엔터티 개체를 캐스팅 할 수 있습니다

<% foreach (var item in Model.Spaces as IEnumerable<Space>) 
    { 
+0

첫 번째 옵션 : 원래 게시물에 대한 내 코멘트에서 언급했듯이 단순히 공백을 나열하지 않고 고객 개체 모델에 공백으로 구성된 EntitySet이 포함 된 자세한 고객 개체 모델 계정 정보를 표시합니다. 두 번째 옵션 : foreach 문에서 캐스팅을 시도했지만 다음 오류가 발생합니다. "암시 적으로 'System.Data.Linq.EntitySet '형식을 '개체'형식으로 변환 할 수 없습니다."- 나는 View Model 접근법을 사용하는 것이 길이다라고 생각하고 있지만, 나는 스스로를 복제하고 싶지 않다. –

1
  • 첫째을 모두 사용하여보기 모델의 DTO에 직접 액세스하는 대신 은 이 좋습니다. (이것에 대한 사용 Automapper)

  • 둘째, 강하게 보기 모델에 귀하의 의견을 입력하고보기 모델의는 IEnumerable 또는 목록이 보기에 전달 을 가지고, 당신은

+0

공간 컬렉션을 복제하지 않고 View Model을 만드는 방법은 무엇입니까? NerdDinner 자습서를 템플릿으로 사용하고 있으며 View Model의 예는 고객 개체 모델을 사용하는 클래스이며 전달되는 원래 모델을 보완하기 위해 추가 속성을 추가합니다. 이 경우에는 EntitySet of Spaces와 별개의 IEnumerable 컬렉션으로 끝날 것입니다. 이 View Model을 구조화하는 적절한 방법을 설명하는 리소스의 방향을 지적 할 수 있습니까? 감사합니다. –

+0

어림짐작은 뷰가 필요로하는 모든 정보가 전달하는 뷰 모델에있을 것이므로이 뷰 모델은 맞춤형 모델이며 DTO 또는 DTO의 데이터로 채워질 것입니다. IEnumerable을 전달하려는 경우보기 모델에 IEnumerable이 포함됩니다. –

1

그냥 프로젝트에 System.Data.Linq에 대한 참조를 추가합니다.