Хотите сильно типизированный результат от участия в.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).

Другие вопросы по тегам