Хотите получить строго типизированный результат от JOIN в .netTiers
-
07-07-2019 - |
Вопрос
Учитывая запрос типа:
SELECT table1.field1 FirstField, table2.field2 SecondField
FROM table1
INNER JOIN table2 ON table1.FK = table2.PK
WHERE table1.somefield = 'somevalue';
Моя цель — вернуть строго типизированный набор результатов, используя .netTiers.Я предполагаю, что не могу использовать представление, потому что WHERE
предложению нужен параметр, который нельзя передать в представление.Хранимой процедуре можно передать параметр somevalue, но она возвращает слабо типизированное значение. DataSet
или DataReader
.
Я полагаю, что мне просто не хватает концепции.Чтобы внести ясность, я хотел бы в конечном итоге написать что-то вроде этого:
TList <some-entity-name> entityList = DataRepository.SomeProvider.Get( "somevalue" );
foreach ( some-entity-name entity in entityList ) {
DoSomethingWith( entity.FirstField, entity.SecondField );
}
Я бы хотел избежать решения, которое включает в себя фильтр на стороне сервера после выполнения запроса;задействованные таблицы очень большие.
Решение
Создайте представление и используйте строго типизированный объект ParameterBuilder для фильтрации представления по определенному столбцу. Я не могу вспомнить, в каком слое находится этот объект.
Вот как вы бы это использовали:
MyViewParameterBuilder builder = new MyViewParameterBuilder();
builder.AppendEquals(TableColumn.Column, "value");
DataRepository.MyViewEntityProvider.Find(builder.GetParameters());
Возможно, я ошибаюсь, но я не верю, что сетевые уровни на самом деле «фильтруют» объект TList / VList с помощью метода, описанного выше, что и предполагает имя объекта. Строитель генерирует там, где предложение и nettiers выполняет запрос к вашей базе данных, используя это предложение. Р>
Второй вариант - попытаться сгенерировать хранимую процедуру, но только в том случае, если набор результатов вашего хранимого процесса соответствует схеме одной из таблиц в вашей базе данных. В противном случае сетевые уровни не будут знать, как сгенерировать против него. Вы можете узнать больше об этом здесь
Другие советы
Если вам нужна коллекция TList с объединением, вам потребуется создать собственную хранимую процедуру.Решение здесь: http://benpowell.org/paging-and-sorting-in-a-nettiers-custom-stored-procedure/
Если у вас есть такой сценарий:
- Учетная запись (PK AccountId)
- Клиент (PK ClientId)
- ClientAccount (PK ClientId, AccountId)
Если у вас есть правильная настройка внешних ключей, .NetTiers предоставит вам соответствующий метод:
AccountService s = new AccountService();
TList<Account> accountCollection = s.GetByClientIdFromClientAccount(1);
Также создан перегруженный метод, поддерживающий разбиение на страницы (к сожалению, без предложения orderBy).