2010-08-20 6 views
6

Sub Select에서 저장소를 호출하려고하면이 오류가 발생합니다. 방법 'System.Linq.IQueryable`1 [aaa.Models를 인식하지 못하는 엔티티에 LINQ :LINQ to Entities가 'System.Linq.IQueryable'메서드를 인식하지 못합니다.

IGrpTextRepository rep = new GrpTextRepository(); 

     var query = new DetailViewModel 
     { 
      ViewDet = (from gh in _db.Grp 
         select new MultiDetailViewModel 
         { 
          Header = gh, 
          Txts = rep.FindAllLangTxtById(gh.GrpID) 

         }).ToList(), 
      Lang = _db.Language.ToList(), 

     }; 

내 인터페이스는 여기에

public interface IGrpTextRepository 
{ 
    IQueryable<GrpText> FindAllLangTxtById(int GrpID); 
} 

public class GrpTextRepository : IGrpTextRepository 
{ 
    DBEntities db = new DBEntities(); 

    public IQueryable<GrpText> FindAllLangTxtById(int GrpID) 
    { 
     return (from lang in db.Language 
       join gtxts in db.GrpText on lang.LangID equals gtxts.LangID into jointxt 
       from fintxt in jointxt.DefaultIfEmpty() 
       where fintxt.GrpID == GrpID 
       select fintxt); 
    } 


} 

전체 오류 메시지
System.NotSupportedException입니다 .GrpText] FindAllLangTxtById (Int32) '메서드를 사용하고이 메서드는 저장소 식으로 변환 할 수 없습니다.

+0

위시 나는 이것을 간결하게 설명 할 수 있습니다 ... 이미 IQueryable 인터페이스, 지연된 실행 및 표현식 트리에 대해 얼마나 알고 있습니까? – jfar

답변

13

간단한 해결책은 select (...) 앞에 .ToList()를 추가하는 것입니다.

ViewDet = _db.Grp.ToList().Select(gh => new MultiDetailViewModel ...) 

초기 요청이 데이터베이스로 이동합니다 그런 식으로, 결과에 다시 와서 당신은 그 개체에 Linq에 대해 SELECT 문을 사용하여 재 투영 할 수 있습니다.

하지만 그룹과 텍스트 사이에 FK 관계가 없으므로 두 가지 사이의 엔티티 연결이 왜 gh.GrpText에 액세스하고 느리게로드되는 텍스트 콜렉션에 도달하는지 (또는 열심히로드되었는지 .Include() 사용).

@Doguhan Uluca가 의견에서 지적한대로 ToList()을 사용하면 테이블의 모든 내용이 메모리로 가져 오기 때문에 위험합니다. 아주 작은 컬렉션에서만 사용해야합니다. 올바른 접근 방식은 데이터베이스 디자인을 수정하여 효율적으로 쿼리 할 수 ​​있도록하는 것입니다.

+0

I 이미 그룹과 텍스트 사이에 FK가 있습니다. . 내 언어 테이블과 함께 왼쪽 조인을 사용하여 하위 쿼리를 만들고 싶습니다. 각 그룹 텍스트의 목록을 다른 언어로 원합니다. 그룹 텍스트가 특정 언어에 대한 거래가 아니면 결과를 null로 지정합니다. –

+7

데이터베이스 테이블에서 .ToList()를 호출하지 말 것을 권합니다. 메모리에 전체 테이블을로드하지 않으려는 경우입니다. –

+0

@DoguhanUluca - 그렇다면이 .ToList()를 호출하는 대신 무엇을 할 수 있습니까? – oonyalo

관련 문제