Я работаю над приложением .NET 4, C#, Entity Framework 4, SQL Server 2008.Как я могу реорганизовать этот метод IQueryable <T>?
У меня есть 7 таблиц в моей базе данных, каждая из которых представляет определенный уровень местоположения (Страна, Штат, Город, Окрестности и т. Д.).
Теперь в моем репозитории я пытаюсь определить контракт интерфейса, который имеет только один метод Find(). Для этого я создал абстрактный класс под названием «Местоположение», для которого все объекты 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().
По сути, мне нужен метод репозитория, который возвращает все страны/города/государства и т. Д. (Как 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();
....
Тьфу!
Это то, что мой репозиторий договора в данный момент выглядит (и я хочу, чтобы сохранить его таким образом):
IQueryable<Location> Find();
Таким образом, любые лучшие идеи, чем имеющие все те СОЮЗА? Метод расширения IQueryable<T>
, который может динамически соединяться с несколькими IQueryable?
Помните, что у меня также есть уровень обслуживания, который выполняет фильтрацию/сбор проекции (отложенное выполнение). Репозитарию необходимо вернуть «запросы», а не конкретные коллекции.
Оцените справку.
Я не буду говорить, что ваш дизайн «неправильный» ... давайте просто скажем: «Я не понимаю». Это, как говорится, похоже, что вы хотите выполнять поиск, например: все улицы в определенном городе; все почтовые индексы касаются определенной улицы; все города и районы в определенном графстве; все улицы в определенном районе; и т. д. Это близко? –
@Neil T - место сверху. Я хочу, чтобы иметь возможность искать любое «местоположение» (город/страна/штат) на основе предикатов. Я не хочу иметь в репозитории с IQueryable FindCities(), IQueryable FindStates() и т. Д. Мне нужен единственный метод Find(), который способен возвращать коллекцию любого типа местоположения. –
RPM1984
Является ли «Местоположение» также классом сущности? Если да, то почему вы не можете просто извлечь все экземпляры «Местоположение» из репозитория? – Jacob