Un esempio di Map: "ProduttoriDataMap"

Un esempio pratico di un DataMap con qualche piccola sperimentazione... Ci sono oggetti che potreste non riconoscete e di cui non vedete la definizione, sono oggetti di librerie mie ma giusdico si possa capire il funzionamento... Chiedo scusa per la nomenclatura, un brutto mischione "it-en-IT" :-p Il naming è importante per cui è sempre bene tenere sotto mano "Naming Guidelines" di MSDN e "Naming Guidelines" del wiki.

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using AtlanteSapori.v2.Data.SqlClient.Util;
namespace AtlanteSapori.v2.Data.SqlClient
{
    abstract class ProduttoriDataMapBase: IDataMap
    {
        #region InnerProduttore
        class InnerProduttore:Produttore 
        {
            public override Recapiti Recapiti
            {
                get
                {
                    if (base.Recapiti == null)
                    {
                        base.Recapiti = DataProviderFactory.
                           produttoriDataProviderDefaultInstance.
                             RecuperaRecapitiPerProduttore(this.UID);
                    }
                    return base.Recapiti;
                }
                set
                {
                    base.Recapiti = value;
                }
            }

            public override Categorie CategorieAssociate
            {
                get
                {
                    if (base.CategorieAssociate == null)
                    {                        
                        base.CategorieAssociate = DataProviderFactory.
                          produttoriDataProviderDefaultInstance.
                           RecuperaCategoriePerProduttore(this.UID);
                    }
                    return base.CategorieAssociate;
                }
                protected set
                {
                    base.CategorieAssociate = value;
                }
            }
        }
        #endregion

        public ProduttoriDataMapBase(){}
                
        #region IRecordMap Members
        public Produttore Convert(System.Data.IDataRecord record)
        {
            DataRecordWrap r = new DataRecordWrap(record);
            InnerProduttore produttore = new InnerProduttore();
            produttore.ID = r.GetInt32("ID");
            produttore.UID = r.GetGuid("UID");
            produttore.NomeProduttore = r.GetString("Nome");
            produttore.DenominazioneCompleta = r.GetString("Denominazione");
            produttore.Descrizione = r.GetString("Descrizione");
            produttore.Immagine = r.GetString("Immagine");
            produttore.Identificativo = r.GetString("Identificativo");
            produttore.Regione = DataProviderFactory.dataFeedDataProviderDefaultInstance.RetrieveRegioneById(r.GetInt32("IDRegione"));
            return produttore;
        }
        #endregion
        
        #region IDbCommandBuilder Members
        public abstract System.Data.IDbCommand PrepareCommand();
        #endregion
    }

    class ProduttoriDataMap: ProduttoriDataMapBase
    {
        #region Filters
        class FilterPerCategoria : CommandFilter
        {
            int idCategoria;

            public FilterPerCategoria(int idCategoria)
            {
                this.idCategoria = idCategoria;
            }

            public override void AddFilter(StringBuilder sql, SqlParameterCollection parameters)
            {
                #region Filtro categoria
                if (idCategoria != -1)
                {
                    sql.Append(" AND UID IN (SELECT DISTINCT UIDProduttore FROM AS_VIEW_Prodotti WHERE IDCategoria =  @IDCategoria) ");
                    SqlParameter idCategoriaParameter = new SqlParameter("@IDCategoria", SqlDbType.Int);
                    idCategoriaParameter.Value = idCategoria;
                    parameters.Add(idCategoriaParameter);
                }
                #endregion
            }
        }

        class FilterPerRegione : CommandFilter
        {
            int idRegione;

            public FilterPerRegione(int idRegione)
            {
                this.idRegione = idRegione;
            }

            public override void AddFilter(StringBuilder sql, SqlParameterCollection parameters)
            {
                #region Filtro regione
                if (idRegione != -1)
                {
                    sql.Append(" AND IDRegione = @IDRegione");
                    SqlParameter idRegioneParameter = new SqlParameter("@IDRegione", SqlDbType.Int);
                    idRegioneParameter.Value = idRegione;
                    parameters.Add(idRegioneParameter);
                }
                #endregion
            }
        }

        class FilterPerNomeLike : CommandFilter
        {
            string nomeProduttore;

            public FilterPerNomeLike(string nomeProduttore)
            {
                this.nomeProduttore = nomeProduttore;
            }

            public override void AddFilter(StringBuilder sql, SqlParameterCollection parameters)
            {
                #region Filtro like nome produttore
                ///Nella ricerca per nome prodotto/nome produttore se stringa 
                ///minore 5 significa inizia per; se stringa >= 5 allora significa contiene parola.  
                if (!string.IsNullOrEmpty(nomeProduttore))
                {
                    sql.Append(" AND Nome LIKE @NomeProduttore");
                    SqlParameter nomeProduttoreParameter = new SqlParameter("@NomeProduttore", SqlDbType.VarChar);
                    if (nomeProduttore.Length < 5)
                    {
                        nomeProduttoreParameter.Value = string.Format("{0}%", nomeProduttore);
                    }
                    else
                    {
                        nomeProduttoreParameter.Value = string.Format("%{0}%", nomeProduttore);
                    }
                    parameters.Add(nomeProduttoreParameter);
                }
                #endregion
            }
        }
        #endregion

        private string nomeProduttore;

        public string NomeProduttore
        {
            get { return nomeProduttore; }
            set { nomeProduttore = value; }
        }

        private int idCategoria = -1;

        public int IdCategoria
        {
            get { return idCategoria; }
            set { idCategoria = value; }
        }

        private int idRegione = -1;

        public int IdRegione
        {
            get { return idRegione; }
            set { idRegione = value; }
        }

        protected void AddDynamicFilters(StringBuilder sql, SqlParameterCollection parameters)
        {
            CommandFilterCollection commandFilters = new CommandFilterCollection();
            commandFilters.Add(new FilterPerNomeLike(nomeProduttore));
            commandFilters.Add(new FilterPerRegione(idRegione));
            commandFilters.Add(new FilterPerCategoria(idCategoria));
            commandFilters.AddFilters(sql, parameters);
        }

        public override System.Data.IDbCommand PrepareCommand()
        {
            SqlCommand command = new SqlCommand();
            StringBuilder commandText = new StringBuilder("SELECT * FROM AS_Produttori ");
            commandText.Append(" WHERE Enabled = 1 ");
            
            AddDynamicFilters(commandText, command.Parameters);            
            
            commandText.Append(" ORDER BY Nome ASC");            
            command.CommandText = commandText.ToString();
            return command;
        }
    }
}
namespace AtlanteSapori.v2.Data.SqlClient.Util
{
    class CommandFilterCollection : List
    {
        public void AddFilters(StringBuilder sql, SqlParameterCollection parameters)
        {
            foreach (CommandFilter filter in this)
            {
                filter.AddFilter(sql, parameters);
            }
        }
    }
    abstract class CommandFilter
    {
        public abstract void AddFilter(StringBuilder sql, SqlParameterCollection parameters);
    }
}

posted @ venerdì 3 febbraio 2006 19:16

Print

Comments on this entry:

# re: I Parametri: questi strani oggetti...

Left by UGIBlog di Fabio Cozzolino at 03/02/2006 19:22
Gravatar
Comments have been closed on this topic.
«dicembre»
domlunmarmergiovensab
24252627282930
1234567
891011121314
15161718192021
22232425262728
2930311234