lunedì 25 luglio 2011

Linq con ricerca dinamica

Uno dei problemi più ricorrenti e di aggiungere o rimuovere parametri in una ricerca
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: