2014-11-04 3 views
1

IEnumerator와 동일한 IQueryable은 GetEnumerator 메서드를 포함하고 있지만 부분 뷰 IQueryable 개체에 전달할 때 Razor는 GetEnumerator에 대한 정의가 없다고 말했습니다.면도기. GetEnumerator에 대한 공용 정의가 포함되어 있지 않기 때문에 @foreach 문을 사용할 수 없습니다.

다음
public interface IComments : IDisposable 
    { 
     IQueryable<comments> GetPostComments(int postid); 
     //void Add(comments comment); 
     //void Update(comments comment); 
     //void Remove(int id); 
    } 

이 저장소입니다 : 여기 인터페이스 정의입니다

public class CommentsRepository: IComments, IDisposable 
    { 
     private blogaspnetEntities db; 
     public CommentsRepository(blogaspnetEntities db) 
     { 
      this.db = db; 
     } 
     public IQueryable<comments> GetPostComments(int postid) 
     { 
      var all = from a in db.comments 
         orderby a.Posted descending 
         where a.PostID == postid 
         select a; 
      return all; 
     } 
     private bool disposed = false; 

     protected virtual void Dispose(bool disposing) 
     { 
      if (!this.disposed) 
      { 
       if (disposing) 
       { 
        db.Dispose(); 
       } 
      } 
      this.disposed = true; 
     } 

     public void Dispose() 
     { 
      Dispose(true); 
      GC.SuppressFinalize(this); 
     } 
    } 

그리고 마지막 부분이다 :

@model BlogAspNetMVC.Models.comments 

<div class="row"> 
    @foreach (var item in Model) 
    { 
     <div class="col-md-12"> 
      <div class="panel panel-default"> 
       <div class="panel-heading"> 
        <h3 class="panel-title">@item.Author " сказал " @item.Posted ":"</h3> 
       </div> 
       <div class="panel-body"> 
        @Html.Raw(HttpUtility.HtmlDecode(@item.Comment)) 
       </div> 
      </div> 
     </div> 
    } 
</div> 

내가 너 때문에 같은 잘못 것을 얻을 수 없습니다 정말이야 이 모든 것이 IQuerybale이라는 것을 알 수 있습니다. 오후 8시 30 분 P.S. 여기 모델이 있습니다 :

public partial class comments 
    { 
     public int ID { get; set; } 
     public string Comment { get; set; } 
     public Nullable<int> Author { get; set; } 
     public Nullable<System.DateTime> Posted { get; set; } 
     public Nullable<int> PostID { get; set; } 

     public virtual blog_post blog_post { get; set; } 
    } 

P.P. 부모 ViewModel :

<div class="col-md-12"> 
     @Html.Partial("~/Views/comments/Details.cshtml", new BlogAspNetMVC.Models.comments()) 
    </div> 
+2

모델이'IComments' 인 경우 * IQueryable이 아니며 IQueryable을가집니다. –

+0

알 겠어. 어떻게 모델을 바꿔야 하나? –

+2

샘플에 관련없는 많은 코드가 표시되지만 문제의 유형 ('BlogAspNetMVC.Models.comments')은 표시되지 않습니다. 이 유형의 인스턴스를 반복 할 때 IEnumerable (또는 적어도'GetEnumerator')을 구현해야합니다. 반복 할 컬렉션과 같은 객체를 찾는 것은 사용자의 몫입니다. –

답변

3

의견 클래스 모델 정의를 추가하지 않으셔도됩니다.

이 시도 ...

@model IEnumerable<BlogAspNetMVC.Models.comments> 

모델은 반복을 필요로

이 코멘트 클래스는 IEnumerable/된 IQueryable 인터페이스를 구현해야합니다,이 경우에이 구현되지 않습니다. 또는 부분 뷰는 IEnumerable/IQueryable 객체를 모델로 가져와야합니다.

문제를 해결하려면 부분 뷰 렌더링 (모델 바인딩)에 List를 전달해야합니다.

이것은 내가 시도한 것이고 나를 위해 일했습니다.

제어기는 I 수정

@model IQueryable<WebApplication1.Models.comments> 

, 같은 @model 지시문을 사용한다 (부분적인 뷰를 렌더링) 상위 관점에서 볼

IQueryable<comments> commentsList = commentsRepository.GetPostComments(1); 
     return View(commentsList); 

에 IQueriable 객체를 전달해야 @ 부분 뷰의 모델 지시문은 다음과 같습니다.

@model IQueryable<WebApplication1.Models.comments> 

한번 시도하면 올바르게 작동합니다.

+0

나는이 방법을 의도적으로 건너 뜁니다. 확실히 문제는 여기에 없습니다. –

+0

도움이되었습니다. –

1

혼란 몇 가지 : 당신이 정말로 Comment (단수, 대문자) 및 BlogPost (대문자없이 밑줄)에 그 이름을 변경해야 c# naming conventions를 들어

public interface IComments : IDisposable 
{ 
    IQueryable<comments> GetPostComments(int postid); 
    //void Add(comments comment); 
    //void Update(comments comment); 
    //void Remove(int id); 
} 

public partial class comments 
{ 
    public int ID { get; set; } 
    public string Comment { get; set; } 
    public Nullable<int> Author { get; set; } 
    public Nullable<System.DateTime> Posted { get; set; } 
    public Nullable<int> PostID { get; set; } 

    public virtual blog_post blog_post { get; set; } 
} 

ICommentRepository 또는 이후 비슷한에 대한 인터페이스 CommentRepository이 그것을 구현하는 것입니다하지 comments

@model 당신이 오류가 발생하는 이유입니다 IEnumerable (또는 IQueryable)을해야 사용하고 있습니다.

@model IEnumerable<BlogAspNetMVC.Models.Comment>

GetEnumerator

는 면도기가 미친 이유, 당신은 당신의 모델 (BlogAspNetMVC.Models.comments) (경우에도 하나의 실체를 말하고있다이다 IEnumerable 같은 개체의 "목록"의 방법입니다 보기에서 h 열을 전달하고 있기 때.에 유형 안전 점검이 실패합니다. Comment 배열이 아니기 때문에 명명 규칙이 도움이됩니다. (의견)

1

메모리에서의 동작면에서 IEnumerable과 IQueryable의 차이점을 먼저 이해해야합니다.

IEnumerable은 메모리와 성능이 높기 때문에 모든 것을 메모리에로드하므로 값을 추적 할 수 있습니다. 이는 성능에 좋지 않습니다.

IQueryable은 메모리에 쿼리를 만듭니다.이 쿼리는 데이터를 가리키고 있지만 데이터가 없으며 메모리에로드 된 것도 없습니다.이 이유 때문에 쿼리 데이터의 일부 또는 전부를로드하지 않으면 추적 할 수 없습니다. 기억.

데이터를 페이지 (예 : 격자 또는 목록)로 보려는 경우 IQueryable의 이점을 누릴 수 있습니다. 필요한 모든 작업은 데이터의 일부를 선택하여 소스에서 업로드하는 것입니다 (DB)를 IQueryable과 일부 매개 변수를 사용하여 메모리에 저장합니다.

IQueryable<Comment> dataquery = _db.Comments; 

int pagesize = 20; //20 items to be viewed on each page 
int page = 1; 
IList commentslist = dataquery.Skip((page - 1) * pagesize).Take(pagesize).ToList(); 
foreach(Comment cmt in commentslist) 
{ 
    //Here you can trace comments items 
} 
관련 문제