2009-11-16 2 views
0

내 응용 프로그램에서 트리보기를 구현하려고합니다. MVC2 미리보기 1과 SubSonic 3 SimpleRepository를 사용하고 있습니다. 나는 MVC와 Linq에 새로운 사람이다.채우기 Childnode 목록 : Linq 혼란과 우려의 분리

내 문제는보기로 다시 전달할 모델 레코드에 자식 노드 목록을 추가하는 방법을 잘 모르겠다는 것입니다.

public class Category 
{ 
    public Category() 
    { 

    } 

    public int ID { get; set; } 
    public int? ParentId { get; set; } 
    [Required(ErrorMessage="Name is required")] 
    public string Name { get; set; } 
    [SubSonicIgnore] 
    public IEnumerable<Category> Children { get; set; } 

} 

그런 다음 컨트롤러 액션에, 나는 모든 레코드를 끌어와 어린이 회원 갱신을 반복 :

를 그래서 나는 IEnumerable을 내가 컨트롤러 액션에 채워 내 모델 클래스에 어린이라는 추가
public ActionResult Index() 
    { 
     var categories = _repo.All<Category>(); 

     foreach (var c in categories) 
     { 
      c.Children = from p in _repo.All<Category>() 
               where p.ParentId == c.ID 
               orderby p.Name 
               select p; 
     } 
     return View(categories);  
    } 

내 2 질문은 # 1 왜 이것이 작동하지 않습니까? 루프의 범위를 벗어나 내 변경 사항이 손실됩니다. # 2 일반적인 의미에서 이것이 올바른 접근 방법입니까? 이 코드를 컨트롤러에 넣으면 해킹처럼 느껴집니다.

+0

구체적으로 작동하지 않는 것이 확실하지 않다고 생각합니까? 나는이 논리가 컨트롤러에 있어서는 안된다는 것에 동의한다. 저장소와 같은 소리는 모델 클래스가 제대로 수화되어 있는지 확인해야합니다. –

+0

디버거로 foreach를 통해 진행하면서 c.Children get set을 볼 수 있습니다. 그러나 범주의 내용은 변경되지 않습니다. 내 질문은 왜 이것이 작동하지 않는가? – bq1990

답변

0

왜 작동하지 않는 지에 관해서는 지연된 실행으로 인해 문제가 발생한다고 생각합니다. 그래서 (from ... select p).ToList()과 같은 Linq 쿼리를 감싸면 쿼리가 평가됩니다.

접근 방식은 표현 계층에서의 데이터 액세스이므로 일반적으로 말하면 피할 수있는 부분입니다.