tramite lambda Espression.. Io un idea l'ho avuta, funziona.
Immaginiamo di trovarci nella situazione in cui per un anagrafica sia necessario effettuare una ricerca dinamica
e che quindi poste Entity come la nostra entita base e entites la sua collezione
public class Entity
{
public int ID{get;set;}
public string Nome {get;set;}
public string Cognome {get;set;}
public string Codicefiscale {get;set;}
public string Ragionesociale {get;set;}
}
public class Entities :List<Entity>
{
}
Tramite lambda dobbiamo verificare che (escluso l'id) si debba ricercare per i campi posto che questi siano
valorizzati.
Mi sono spremuto un po' e non è stato troppo semplice ma ho trovato una via non comodissima, ma funzionale.
private void prepareData(string sNome, string sCognome,
string sCodicefiscale,
string sRagionesociale)
{
string searchValue ="";
if (sNome.Trim("") != "")
{
searchValue = "Nome^"+sNome+"|";
}
if (sCognome.Trim("") != "")
{
searchValue += "Cognome^"+sCognome+"|";
}
//
// altri campi
//
}
searchValue finrà poi in una variabile statica "fieldList" che utilizzerò nel mio delegato per la ricerca.
Ossia questo:
private static bool FindData(Entity c)
{
string[] fields = fieldList.Split(new char[] { '|' });
Type ct = typeof(Entity);
PropertyInfo[] _p = ct.GetProperties();
bool outvalue = false;
for (int i = 0; i < fields.Length; i++)
{
for (int j = 0; j < _p.Length; j++)
{
string[] _d = fields[i].Split(new char[] { '^' });
if (_p[j].Name == _d[0])
{
outvalue = _p[j].GetValue(c,null).ToString().ToLower().Contains(
_d[1].ToLower()
);
}
}
}
return outvalue;
}
Ed ecco come richiarmare il tutto ... [EntitiesManager è il data provider chi esegue la select su DB...]
Entities tps = EntitiesManager.Select();
var data = tps.FindAll(FindData);
Nessun commento:
Posta un commento