Хотите сильно типизированный результат от участия в .netTiers - PullRequest
1 голос
/ 13 сентября 2009

Учитывая запрос как:

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 ]

2 голосов
/ 13 сентября 2009

Создайте представление и используйте строго типизированный объект ParameterBuilder, чтобы отфильтровать представление по определенному столбцу. Я не могу вспомнить, в каком слое находится этот объект.

Вот как вы бы это использовали:

MyViewParameterBuilder builder = new MyViewParameterBuilder();
builder.AppendEquals(TableColumn.Column, "value");
DataRepository.MyViewEntityProvider.Find(builder.GetParameters());

Возможно, я ошибаюсь, но я не верю, что сетевые уровни на самом деле «фильтруют» объект TList / VList с помощью метода, описанного выше, что и предполагает имя объекта. Строитель генерирует там, где предложение и nettiers запускает запрос к вашей базе данных, используя это предложение.

Ваш второй вариант - попытаться сгенерировать хранимую процедуру, но только если набор результатов вашего хранимого процесса соответствует схеме одной из таблиц в вашей базе данных. В противном случае сетевые уровни не будут знать, как сгенерировать против него. Вы можете прочитать больше об этом здесь

0 голосов
/ 07 декабря 2009

Если вам нужна коллекция 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).

...