// use ordinals to speed up access to DataReader
 // links:
 //  docLink: http://sql2x.org/documentationLink/327451c3-64a8-4de8-b359-76742d634497
 // parameters:
 //  reader: IDataReader from SQLClient
 public void Populate(IDataReader reader, GetCartProductDataOrdinals ordinals)
 {
     if (!reader.IsDBNull(ordinals.ClientId))
     {
         ClientId = reader.GetGuid(ordinals.ClientId);
     }
     if (!reader.IsDBNull(ordinals.ProductName))
     {
         ProductName = reader.GetString(ordinals.ProductName);
     }
     if (!reader.IsDBNull(ordinals.ProductStateRcd))
     {
         ProductStateRcd = reader.GetString(ordinals.ProductStateRcd);
     }
     if (!reader.IsDBNull(ordinals.ProductId))
     {
         ProductId = reader.GetGuid(ordinals.ProductId);
     }
     if (!reader.IsDBNull(ordinals.FinancialCurrencyTypeRcd))
     {
         FinancialCurrencyTypeRcd = reader.GetString(ordinals.FinancialCurrencyTypeRcd);
     }
     if (!reader.IsDBNull(ordinals.FinancialCurrencyAgainstFinancialCurrencyTypeRcd))
     {
         FinancialCurrencyAgainstFinancialCurrencyTypeRcd = reader.GetString(ordinals.FinancialCurrencyAgainstFinancialCurrencyTypeRcd);
     }
     if (!reader.IsDBNull(ordinals.FinancialCurrencyTypeCode))
     {
         FinancialCurrencyTypeCode = reader.GetString(ordinals.FinancialCurrencyTypeCode);
     }
     if (!reader.IsDBNull(ordinals.FinancialCurrencyTypeName))
     {
         FinancialCurrencyTypeName = reader.GetString(ordinals.FinancialCurrencyTypeName);
     }
     if (!reader.IsDBNull(ordinals.FinancialCurrencyId))
     {
         FinancialCurrencyId = reader.GetGuid(ordinals.FinancialCurrencyId);
     }
     if (!reader.IsDBNull(ordinals.Amount))
     {
         Amount = reader.GetDecimal(ordinals.Amount);
     }
     if (!reader.IsDBNull(ordinals.CartProductStateRcd))
     {
         CartProductStateRcd = reader.GetString(ordinals.CartProductStateRcd);
     }
     if (!reader.IsDBNull(ordinals.ImageBlobFilename))
     {
         ImageBlobFilename = reader.GetString(ordinals.ImageBlobFilename);
     }
     if (!reader.IsDBNull(ordinals.UserId))
     {
         UserId = reader.GetGuid(ordinals.UserId);
     }
     if (!reader.IsDBNull(ordinals.DefaultUserName))
     {
         DefaultUserName = reader.GetString(ordinals.DefaultUserName);
     }
     if (!reader.IsDBNull(ordinals.DateTime))
     {
         DateTime = reader.GetDateTime(ordinals.DateTime);
     }
     if (!reader.IsDBNull(ordinals.CartProductId))
     {
         CartProductId = reader.GetGuid(ordinals.CartProductId);
     }
     if (!reader.IsDBNull(ordinals.SessionIdentificator))
     {
         SessionIdentificator = reader.GetString(ordinals.SessionIdentificator);
     }
 }
        /// <summary>Get Cart Product</summary>
        /// <cardinality>Many</cardinality>
        /// <template>WithDurian</template>
        public List <GetCartProductData> GetCartProduct(
            System.Guid clientId
            , System.Guid productId
            , System.Guid financialCurrencyId
            , System.Guid userId
            , System.Guid cartProductId
            , string sessionIdentificator
            )
        {
            var    ret = new List <GetCartProductData>();
            string sql = @"
select 
    -- c.first_name
    --,c.middle_name
    --,c.last_name
    --,c.client_nationality_rcd
    --,c.client_gender_rcd
    --,c.client_title_rcd
    --,c.client_type_rcd
     cp.client_id
    ,p.product_name
    ,p.state_rcd as product_state_rcd
    ,cp.product_id
    ,fc.financial_currency_type_rcd
    ,fc.financial_currency_against_financial_currency_type_rcd
    ,fc.financial_currency_type_code
    ,fc.financial_currency_type_name
    ,cp.financial_currency_id
    ,cp.amount
    ,cp.state_rcd as cart_product_state_rcd
    ,c.image_blob_filename
    ,cp.user_id
    ,du.default_user_name
    ,cp.date_time
    ,cp.cart_product_id
    ,cp.session_identificator
from cart_product as cp
inner join client as c on c.client_id = cp.client_id
inner join product as p on p.product_id = cp.product_id
inner join financial_currency as fc on fc.financial_currency_id = cp.financial_currency_id
inner join default_user as du on du.default_user_id = cp.user_id
  and cp.state_rcd = @state_ref_created
where 1 = 1
";

            using (var conn = new SqlConnection(ConfigurationManager.AppSettings["Conn"])) {
                conn.Open();

                using (var command = new SqlCommand(sql, conn)) {
                    command.Parameters.Add("@state_ref_created", SqlDbType.VarChar).Value = (System.String)DefaultStateRef.Created;

                    if (clientId != Guid.Empty)
                    {
                        command.Parameters.Add("@client_id", SqlDbType.UniqueIdentifier).Value = (System.Guid)clientId;
                        sql += " and cp.client_id = @client_id";
                    }
                    if (productId != Guid.Empty)
                    {
                        command.Parameters.Add("@product_id", SqlDbType.UniqueIdentifier).Value = (System.Guid)productId;
                        sql += " and cp.product_id = @product_id";
                    }
                    if (financialCurrencyId != Guid.Empty)
                    {
                        command.Parameters.Add("@financial_currency_id", SqlDbType.UniqueIdentifier).Value = (System.Guid)financialCurrencyId;
                        sql += " and cp.financial_currency_id = @financial_currency_id";
                    }
                    if (userId != Guid.Empty)
                    {
                        command.Parameters.Add("@user_id", SqlDbType.UniqueIdentifier).Value = (System.Guid)userId;
                        sql += " and cp.user_id = @user_id";
                    }
                    if (cartProductId != Guid.Empty)
                    {
                        command.Parameters.Add("@cart_product_id", SqlDbType.UniqueIdentifier).Value = (System.Guid)cartProductId;
                        sql += " and cp.cart_product_id = @cart_product_id";
                    }
                    if (!string.IsNullOrEmpty(sessionIdentificator))
                    {
                        command.Parameters.Add("@session_identificator", SqlDbType.NVarChar).Value = sessionIdentificator;
                        sql += " and cp.session_identificator = @session_identificator";
                    }

                    command.CommandText = sql;

                    // Logging log = Logging.PerformanceTimeStart("GetCartProduct");
                    IDataReader reader = command.ExecuteReader(CommandBehavior.SingleResult);
                    // log.PerformanceTimeStop(sql, command);

                    var ordinals = new GetCartProductDataOrdinals(reader);

                    while (reader.Read())
                    {
                        var data = new GetCartProductData();
                        data.Populate(reader, ordinals);
                        ret.Add(data);
                    }

                    reader.Close();
                }

                return(ret);
            }
        }