Я работаю над приложением .NET 4, C #, Entity Framework 4, SQL Server 2008.
У меня есть 7 таблиц в моей базе данных, каждая из которых представляет определенный уровень местоположения (Страна, Штат, Город, Соседство и т. Д.).
Теперь в моем репозитории я пытаюсь определить интерфейсный контракт, который имеет только один метод Find ().Для этого я создал абстрактный класс «Location», для которого все POCO-местоположения наследуются.
Вот метод, который у меня сейчас есть:
public IQueryable<Location> Find()
{
return AllCountries()
.Union(AllStates())
.Union(AllCounties())
.Union(AllCities())
.Union(AllNeigbourhoods())
.Union(AllZipCodes())
.Union(AllStreets());
}
Эти встроенные методы (например, AllStates) являются частными методами IQueryable, например:
private IQueryable<Location> AllCountries()
{
var db = new MyCustomDataContext();
return db.Countries;
}
Все это прекрасно работает, но мне не нравится внешний вид кода в методе Find ().
По существу,Я хочу метод Repository, который возвращает все страны / города / государства и т. Д. (Как IQuerable<Location>
).
Таким образом, мой уровень обслуживания может сделать это:
var countries = repository.Find(somePredicate).OfType<Country>().ToList();
Или вот это:
var countries = repository.Find(somePredicate).OfType<City>().ToList();
Поэтому мне нужно только объявить один метод Find.Вы можете думать о классе Location как о моем «совокупном корне».
Без использования абстрактного класса мой контракт на репозиторий будет выглядеть так:
IQueryable<City> FindCities();
IQueryable<State> FindStates();
IQueryable<Country> FindCountries();
....
Yuck!
Вот как выглядит мой контракт на хранилище (и я хочу сохранить его таким):
IQueryable<Location> Find();
Итак, есть ли лучшие идеи, чем иметь все эти профсоюзы?Метод расширения IQueryable<T>
, который может динамически связывать несколько IQueryable?
Помните, что у меня также есть Сервисный уровень, который выполняет фильтрацию / сбор проекций (отложенное выполнение).Хранилище должно возвращать «запросы», а не конкретные коллекции.
Оцените помощь.