Лично я бы пошел по пути лямбды. Это может быть из-за моей любви к лямбде, но она предоставляет много места для общей настройки репозитория.
С учетом следующего:
bannerRepository.Find.Where(banner => banner.IsFrontendCampaignBanner && banner.IsSmallMediaBanner)
Я не знаю, как выглядит ваш паттерн, но вы могли бы изменить некоторые вещи здесь:
Создайте универсальный интерфейс с именем «IRepository» типа, содержащий все методы для доступа к данным.
Это может выглядеть так:
interface IRepository<T> where T : class
{
IEnumerable<T> FindAll(Func<T, bool> exp);
T FindSingle(Func<T, bool> exp);
}
Создайте абстрактный класс 'Repository', реализующий этот интерфейс:
class Repository<T> : IRepository<T> where T : class
{
TestDataContext _dataContext = TestDataContext();
public IEnumerable<T> FindAll(Func<T, bool> exp)
{
_dataContext.GetTable<T>().Where<T>(exp);
}
public T FindSingle(Func<T, bool> exp)
{
_dataContext.GetTable<T>().Single(exp);
}
}
Теперь мы можем создать интерфейс для таблицы / объектов баннеров, который реализует наш «IRepository» и конкретный класс, расширяющий абстрактный класс «Repository» и реализующий «IBannerInterface»:
interface IBannerRepository : IRepository<Banner>
{
}
И соответствующий репозиторий для его реализации:
class BannerRepository : Repository<Banner>, IBannerRepository
{
}
Я бы предложил использовать этот подход, поскольку он дает вам большую гибкость и достаточную мощность для управления всеми крошечными объектами, которые у вас есть.
Вызывать эти методы будет очень просто:
BannerRepository _repo = new BannerRepository();
_repo.FindSingle(banner => banner.IsFrontendCampaignBanner && banner.IsSmallMediaBanner);
Да, это означает, что вам нужно выполнить какую-то работу, но вам будет гораздо проще изменить источник данных позже.
Надеюсь, это поможет!