Pregunta

Dada una consulta como:

SELECT table1.field1 FirstField, table2.field2 SecondField
    FROM table1
    INNER JOIN table2 ON table1.FK = table2.PK
    WHERE table1.somefield = 'somevalue';

Mi objetivo es devolver un conjunto de resultados fuertemente tipado usando .netTiers. Supongo que no puedo usar una vista porque la cláusula WHERE necesita un parámetro, que no se puede pasar a una vista. Un procedimiento almacenado puede pasar el parámetro 'somevalue' pero devuelve un DataSet o DataReader débilmente tipado.

Supongo que me falta un concepto aquí. Para ser claros, lo que me gustaría terminar es poder escribir algo como esto:

TList <some-entity-name> entityList = DataRepository.SomeProvider.Get( "somevalue" );

foreach ( some-entity-name entity in entityList ) {
    DoSomethingWith( entity.FirstField, entity.SecondField );
}

Me gustaría evitar una solución que implique un filtro del lado del servidor después de que se haya ejecutado la consulta; las mesas involucradas son muy grandes.

¿Fue útil?

Solución

Cree una vista y use el objeto ParameterBuilder fuertemente tipado para filtrar la vista en la columna específica. No puedo recordar en qué capa se encuentra este objeto.

Así es como lo usarías:

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

Puedo estar equivocado, pero no creo que los niveles de red realmente 'filtren' el objeto TList / VList con el método anterior, que es lo que sugeriría el nombre del objeto. El generador genera allí donde cláusula y nettiers ejecutan una consulta en su base de datos utilizando esta cláusula.

Su segunda opción es intentar generar un procedimiento almacenado, pero solo si el conjunto de resultados de su proceso almacenado coincide con el esquema de una de las tablas de su base de datos. De lo contrario, los niveles de red no sabrán cómo generar en su contra. Puede leer más sobre eso aquí

Otros consejos

Si desea una colección TList con una unión, deberá crear un procedimiento almacenado personalizado. Solución aquí: http://benpowell.org/ paginación-y-clasificación-en-un-nettiers-personalizado-almacenado-procedimiento /

Si tiene un escenario como este:

  • Cuenta (PK AccountId)
  • Cliente (PK ClientId)
  • ClientAccount (PK ClientId, AccountId)

Mientras tenga la configuración correcta de claves externas, .NetTiers le proporcionará el método apropiado:

AccountService s = new AccountService();
TList<Account> accountCollection = s.GetByClientIdFromClientAccount(1);

También se genera un método sobrecargado que admite la paginación (lamentablemente sin cláusula orderBy).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top