2010-08-20 9 views
6

Kiedy próbuję wywołać moje repozytorium w Sub Select, mam ten błąd.LINQ to Entities nie rozpoznaje metody "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(), 

     }; 

My Interfejs jest

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); 
    } 


} 

Oto Komunikat o błędzie pełny
System.NotSupportedException: LINQ do podmiotów nie rozpoznaje metoda „System.Linq.IQueryable`1 [aaa.Models .GrpText] FindAllLangTxtById (Int32) 'metoda, a tej metody nie można przetłumaczyć na wyrażenie składowe.

+0

Chciałbym wyjaśnić to zwięźle ... Ile wiesz już o interfejsie IQueryable, odroczonym wykonaniu i drzewach wyrażeń? – jfar

Odpowiedz

13

Proste rozwiązanie polega na dodaniu .ToList() przed wyborem (...).

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

ten sposób pierwotny wniosek trafi do bazy danych, wrócić z wynikami, a następnie można odwzorować je za pomocą SELECT względem Linq do obiektów.

Ale muszę zapytać, dlaczego nie ma związku między grupami a tekstami, a tym samym Stowarzyszenie Podmiotów między tymi dwoma, umożliwiając dostęp do zbioru gh.GrpText i do zbioru tekstów ładowanych leniwie (lub ładnie ładowanych przy użyciu .Include()).

Jak zauważa @Doguhan Uluca w komentarzach, używanie ToList() jest ryzykowne, ponieważ spowoduje, że wszystko w tej tabeli zostanie przeniesione do pamięci. Powinieneś używać go tylko w bardzo małych kolekcjach. Prawidłowe podejście polega na poprawieniu projektu bazy danych, tak aby można było wydajnie wykonywać kwerendy.

+0

Mam już FK między grupą a tekstem. . Chcę wykonać podzapytanie z lewym złączem z moją tabelą języków. Chcę listę każdego tekstu grupy w innym języku. Jeśli tekst grupy nie jest traduct dla konkretnego języka, chcę wynik jako null. –

+7

Odradzam wywoływanie .ToList() na twojej bazie danych, chyba że chcesz załadować całą tabelę do pamięci. –

+0

@DoguhanUluca - Więc jaka jest alternatywa dla wywoływania .ToList() w takiej sytuacji? – oonyalo

Powiązane problemy