2014-04-10 1 views
1

ViewModel을 사용하여 partialview에서 트리 뷰 메뉴 컨트롤을 바인딩하려고합니다. 네비게이션 트리 메뉴에 필요한 모든 중첩 된 데이터를 한 번에 전달할 수 있다고 가정하고 중첩 된 방식으로 데이터를 가져 오기 위해 linq 쿼리를 작성한 것으로 가정하여 중첩 된 viewModel을 만들었습니다. 초보자로서 나는 이것이 올바른 방법임을 100 % 확신하지 못했습니다. Linq 쿼리 결과로 내 뷰 모델을 바인딩하려고합니다. 내 모델이 중첩되어 있고 내 Linq 쿼리도 마찬가지입니다. 이 두 가지를 함께 성형하는 데 어려움을 겪고 있습니다. 지금까지 어떤 방법 나는 그런 내 코드 .. 컬렉션은 IList에 유형 IQueriable에서 변환 할 수있는 타입 캐스팅 오류가 발생하고 시도 :ASP.Net MVC - LINQ 쿼리 결과를 ViewModel으로 캐스팅 할 수 없습니다.

 // ViewModel 
namespace My.Namespace 
{ 
    public class MyViewModel 
    { 
     public decimal CategoryID { get; set; } 
     public string CategoryName { get; set; } 
     public decimal Badge { get; set; } 
     public IList<SubCategories> CategorySubCategories { get; set; } 
    } 
    public class SubCategories 
    { 
     public decimal SubCategoryID { get; set; } 
     public string SubCategoryName { get; set; } 
     public decimal Badge { get; set; } 
     public List<Items> SubCategoryItems { get; set; } 
    } 
    public class Items 
    { 
     public decimal ID { get; set; } 
     public string ItemName { get; set; } 
     public List<SubItems> SubItems { get; set; } 
    } 
    public class SubItems 
    { 
     public decimal ID { get; set; } 
     public string SubItemName { get; set; } 
    } 
} 


//Databinding code: 

    MyViewModel result = new MyViewModel(); 
      var query= (List<MyViewModel>)(from c in dbContext.TableName 
         where c.CHILD_ID == 0 
         select new MyViewModel 
         { 
          CategoryID = c.ELEMENT_ID, 
          CategoryName = c.CHILD_DESC, 
          CategorySubCategories = (List<SubCategories>)(from s in dbContext.TableName 
                      where s.PARENT_ID == c.ELEMENT_ID 
                      select new SubCategories 
                      { 
                       SubCategoryID = s.ELEMENT_ID, 
                       SubCategoryName = s.CHILD_DESC, 
                       SubCategoryItems = (List<Items>)(from i in dbContext.TableName 
                               where i.PARENT_ID == s.ELEMENT_ID 
                               select new Items 
                               { 
                                ID = i.ELEMENT_ID, 
                                ItemName = i.CHILD_DESC 
                               } 
                            ) 
                      } 
                      ) 
         }); 

return query.toList(); 

내가 점점 오전 오류가 @ 라인입니다 : var에 쿼리 = (목록) (., 뷰 모델에 유형의 객체 System.Data.Entity.Infrastructure.DbQuery 1[MyViewModel]' to type 'System.Collections.Generic.List 1 MyViewModel] '

+0

select 문의 끝에 ToList()를 추가하십시오. –

+0

@Andrei, 나는 그랬고 같은 오류가 발생했습니다. 'System.Collections.Generic.List'1'형식으로 'System.Linq.IQueryable'1'형식을 형 변환 할 수 없습니다. LINQ to Entities는 EDM 프리미티브 또는 열거 형을 캐스팅하는 기능 만 지원합니다. – Hasteq

+0

시도해 보았습니다 var query = 모든 레벨의 주물을 제거하고 모든 레벨에서 .ToList()를 추가하여 다음 오류가 발생했습니다. LINQ to Entities가 'System.Collections.Generic .List'1 [SubCategories] ToList [SubCategories] (System.Collections.Generic.IEnumerable'1 [SubCategories]) '메서드이며이 메서드는 저장소 식으로 변환 할 수 없습니다. – Hasteq

답변

0

캐스트는 IEnumerable 유형에 목록 유형을 변경 없습니다 dbContext.TableName 오류에 C에서. 해당 하위 선택에서 .ToList() 확장 메서드를 사용하지 않도록하십시오.

하위 선택 문의 결과 유형은 List의 인스턴스가 아니지만 IEnumerable 인터페이스를 구현해야합니다. ICollection, IList 등을 구현할 수 있지만 그걸 가지고 놀 수 있습니다.

+0

전방으로 가서 List <>를 내 viewmodel의 IEnumerable <>으로 변경했습니다. 구현은 다음과 같습니다. MyViewModel result = new MyViewModel(); 결과 = (행 dbContext.TableName 에 c.CHILD_ID == 0은 S로부터 ({ 카테고리 ID = c.ELEMENT_ID, 범주 = c.CHILD_DESC, CategorySubCategories = (IEnumerable을 <하위>) 새로운 ToolNavigationViewModel 을 선택 여기서 C in dbContext.TableName ..................... 그러나 캐스팅 오류가 계속 발생합니다 – Hasteq

+0

다음은 사용자가 제안하는 단계입니다. 1. List <>를 ViewModel 클래스의 IEnumerable <> 2.result = (IEnumerable ) (dbContext.TableName의 c에서 가져온 것) ..//sub quit와 같은 적절한 ViewModel Ienumerable을 사용하여 기본 쿼리 및 하위 쿼리를 캐스팅합니다. eries (IEnumerable ) (dbContext.TableName의 s에서 ... ); 그러나 이것은 도움이되지 않습니다. 여기에 기본적인 무언가가 없습니다. – Hasteq

+0

중첩 된 VM과 모델을 flatenning하는 것이 도움이 될 것이라고 생각합니까? – Hasteq