Mam interfejs o nazwie ICatalog
, jak pokazano poniżej, gdzie każdy ICatalog
ma nazwę i metodę, która zwróci elementy oparte na funkcji Predicate<Item>
.Oparte na Linq generyczne alternatywne do Predicate <T>?
public interface ICatalog
{
string Name { get; }
IEnumerable<Item> GetItems(Predicate<Item> predicate);
}
Określona implementacja katalogu może być powiązana z katalogami w różnych formatach, takich jak XML lub baza danych SQL.
W katalogu XML kończę deserializację całego pliku XML do pamięci, więc testowanie każdego elementu za pomocą funkcji predykatu nie powoduje zwiększenia obciążenia, ponieważ jest już w pamięci.
Jednak w przypadku implementacji SQL raczej nie będę pobierał całej zawartości bazy danych do pamięci, a następnie filtruje elementy za pomocą funkcji predykatu. Zamiast tego chciałbym znaleźć sposób, aby jakoś przekazać predykat do serwera SQL, lub jakoś przekonwertować go na zapytanie SQL.
To wydaje się być problemem, który można rozwiązać za pomocą Linq, ale jestem całkiem nowy. Czy mój interfejs powinien zamiast tego zwracać IQueryable? Nie chodzi mi teraz o to, jak faktycznie zaimplementować wersję SQL mojego ICatalog. Po prostu chcę się upewnić, że mój interfejs pozwoli na to w przyszłości.
Dzięki za odpowiedź Marc. Brzmi bardziej skomplikowanie, niż chciałbym robić to, co próbuję zrobić. Co rozumiesz przez "bardziej klasyczny repozytorium/interfejs serwisowy czarnej skrzynki"? Czy możesz podać przykład? –