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