Repozytorium / IQueryable / Query Object
Buduję repozytorium i widziałem w wielu miejscach 2 powody, aby nie ujawniać IQueryable poza repozytorium.
1) Pierwszy polega na tym, że różni dostawcy LINQ mogą zachowywać się inaczej, a ta różnica powinna być zawarta w repozytorium.
2) Drugim jest uniemożliwienie programistom poziomu usług modyfikowania zapytania bazy danych tak, aby przypadkowo spowodowało problemy z wydajnością.
Wydaje mi się, że problemowi 2 można zapobiec tylko poprzez zachowanie całej logiki zapytań w repozytorium i niedopuszczenie jakiejkolwiek formy budowania zapytań zewnętrznych? Ale wydaje mi się to trochę niepraktyczne.
Wydaje się, że problem 1 został rozwiązany za pomocą wzorca obiektu danych.
na przykładpublic IEnumerable<T> FindBy(Query query)
Moje pytanie brzmi: dlaczego nie miałbym po prostu przekazać wyrażenia lambda w, ponieważ jest to niezależne od dostawcy, wydaje się, że zapewnia mi taką samą funkcjonalność jak obiekt zapytania i ten sam poziom separacji?
na przykładpublic IEnumerable<T> FindBy(Expression<Func<T,bool>> predicate)
Czy jest jakiś powód, aby tego nie robić? Czy łamie niektóre zasady? Najlepszych praktyk? o czym powinienem wiedzieć?