Хотите получить строго типизированный результат от JOIN в .netTiers

StackOverflow https://stackoverflow.com/questions/1418188

  •  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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top