Хотите сильно типизированный результат от участия в.netTiers
Учитывая запрос как:
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 );
}
Я бы хотел избежать решения, включающего фильтр на стороне сервера после выполнения запроса; вовлеченные таблицы очень большие.
2 ответа
Создайте представление и используйте строго типизированный объект 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).