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ć?

questionAnswers(2)

yourAnswerToTheQuestion