Hi,
I have tried to follow the example in the documentation for projecting an IDataReader result onto an Entity Collection (which I'll reproduce here for convenience):
// C#
EntityCollection<CustomerEntity> customers = new EntityCollection<CustomerEntity>(new CustomerEntityFactory() );
EntityCollection<OrderEntity> orders = new EntityCollection<OrderEntity>( new OrderEntityFactory() );
using(IRetrievalQuery query = RetrievalProcedures.GetCustomersAndOrdersOnCountryCallAsQuery( "Germany" ))
{
using(DataAccessAdapter adapter = new DataAccessAdapter())
{
using(IDataReader reader = adapter.FetchDataReader(query, CommandBehavior.CloseConnection))
{
// first resultset: Customers.
List<IDataValueProjector> valueProjectors = new List<IDataValueProjector>();
// project value on index 0 in resultset row onto CustomerId
valueProjectors.Add( new DataValueProjector( CustomerFieldIndex.CustomerId.ToString(), 0, typeof( string ) ) );
// project value on index 1 in resultset row onto CompanyName
valueProjectors.Add( new DataValueProjector( CustomerFieldIndex.CompanyName.ToString(), 1, typeof( string ) ) );
// resultset contains more rows, we just project those 2. The rest is trivial.
DataProjectorToIEntityCollection2 projector = new DataProjectorToIEntityCollection2( customers );
adapter.FetchProjection( valueProjectors, projector, reader );
// second resultset: Orders.
valueProjectors = new ArrayList();
valueProjectors.Add( new DataValueProjector( OrderFieldIndex.OrderId.ToString(), 0, typeof( int ) ) );
valueProjectors.Add( new DataValueProjector( OrderFieldIndex.CustomerId.ToString(), 1, typeof( string ) ) );
valueProjectors.Add( new DataValueProjector( OrderFieldIndex.OrderDate.ToString(), 3, typeof( DateTime ) ) );
// switch to the next resultset in the datareader
reader.NextResult();
projector = new DataProjectorToIEntityCollection2( orders );
adapter.FetchProjection( valueProjectors, projector, reader );
reader.Close();
}
}
}
Here is the code which I have written to implement that (database is AdventureWorks):
public EntityCollection<ProductModelEntity> GetProductModels()
{
EntityCollection<ProductModelEntity> productModels = new EntityCollection<ProductModelEntity>();
ResultsetFields fields = new ResultsetFields(6);
fields.DefineField(ProductModelFields.ProductModelId, 0, "ProductModelID");
fields.DefineField(ProductModelFields.Name, 1, "Name");
fields.DefineField(ProductModelFields.CatalogDescription, 2, "CatalogDescription");
fields.DefineField(ProductModelFields.Instructions, 3, "Instructions");
fields.DefineField(ProductModelFields.Rowguid, 4, "rowguid");
fields.DefineField(ProductModelFields.ModifiedDate, 5, "ModifiedDate");
using (DataAccessAdapter adapter = DataAccess.AdaptorFactory.GetNewAdaptor(true))
{
using (IDataReader reader = adapter.FetchDataReader(fields, null, CommandBehavior.SingleResult, 50, true))
{
List<IDataValueProjector> valueProjectors = new List<IDataValueProjector>();
valueProjectors.Add(new DataValueProjector(ProductModelFields.ProductModelId.ToString(), 0, typeof(int)));
valueProjectors.Add(new DataValueProjector(ProductModelFields.Name.ToString(), 0, typeof(string)));
DataProjectorToIEntityCollection2 projector = new DataProjectorToIEntityCollection2(productModels);
adapter.FetchProjection(valueProjectors, projector, reader);
}
}
return productModels;
}
The first thing I don't get is where the CustomerFieldIndex object comes from in the documentation sample. There is no equivalent in the code which I generated. So I tried a bunch of things to substitute for it. The code I showed above just returns 50 tuples with 0 in the ProductModelID field and either an empty string, or null, for the Name field.
Can anyone identify what I have done wrong? Thanks