mgravell / fast-member

Automatically exported from code.google.com/p/fast-member
Apache License 2.0
1.03k stars 139 forks source link

ObjectReader.Create() additional parameter request #77

Open bitofvg opened 5 years ago

bitofvg commented 5 years ago

Would be nice to have something like :

ObjectReader.Create(orderDetails, fields, valuesToForce)

To be used in this way:

 var table = new DataTable();
 string[] fields = { "OrderId", "Price",  "Category", "Manufacturer", "Discount" };
 var valuesToForce = new { OrderId = 15, Discount = 30 };
 var reader = ObjectReader.Create(orderDetails, fields, valuesToForce))
 table.Load(reader);

When the datareader reads the values of fields OrderId or Discount, the value read is forced to the value contained in valuesToForce.

This is very useful with Dapper, after I wrote the Order record and get its Id (identity), normally I loose performance because I have to do the following before insert the order details:

orderDetails.ForEach(od => od.OrderId = OrderId);

with the valuesToForce parameter, I can do id immediately, I can insert the order details with something like:

  public void InsertBulkOrderDetails(List<OrderDetail> orderDetails, int OrderIdToForce) {
     using (var connection = new SqlConnection(@"bla bla bla....")) {

       var table = new DataTable();
       string[] fields = { "OrderId", "Price",  "Category", "Manufacturer", "Discount" };
       var valuesToForce = new { OrderId = OrderIdToForce, Discount = 30 };
       using (var reader = ObjectReader.Create(orderDetails, fields, valuesToForce)) {
         table.Load(reader);
       }
       var csFieldsList = string.Join(",", fields.Select(x => "[" + x + "]"));
       var sql = @"INSERT OrderDetails(" + csFieldsList + @") 
                   SELECT * FROM @data";

        connection.Execute(sql, 
        new { @data = table.AsTableValuedParameter("dbo.OrderDetailsToInsert") });
      }
    }