PDA

View Full Version : [.Net 4.0 / Entity Framework]Query Dinamiche


RaouL_BennetH
12-10-2010, 11:38
Eccomi ancora a rompere :D ma sto letteralmente innamorandomi sempre più di "sto coso" :sofico:

Allora, il mio scenario è questo:

Una semplice griglia che viene popolata dall'entità del caso.

Vorrei applicare un filtro dinamico su questa griglia per es.:

l'entità è formata da cognome, nome, data di nascita, altri dati anagrafici.

Quello che vorrei realizzare è di farmi restituire uno o più records senza specificare su quale "colonna" sto cercando, ad esempio, inserisco un codice fiscale, oppure inserisco le iniziali del cognome. In questi due semplici casi, ciò che mi aspetto è di ottenere un solo record per il codice fiscale, e diversi records per una ricerca parziale sul cognome. Tutto questo senza dover ogni volta specificare:


var query = from persone in context.People
select persone
Where bla

//ma...
var query = from persone in context.People
select persone
where qualsiasiCampo Like filtro


il mio punto di partenza è questo link:

http://msdn.microsoft.com/it-it/library/bb399367.aspx

dal quale ho già ottenuto moltissime informazioni.

Grazie :)

RaouL.

Kralizek
12-10-2010, 12:51
per applicare un numero variabile di filtri devi passare dalla scrittura "a query" a quella "a funzioni" (non ricordo i nomi "ufficiali", ma spero che mi capisci)

noi usiamo qualcosa tipo:


public static IEnumerable<T> Search<T>(this IEnumerable<T> source, IEnumerable<SearchParameter> parameters, SearchContext context)
where T : ISearchObject<T>
{
var items = source;

if (items != null)
{
foreach (SearchParameter parameter in parameters)
{
items = items.Where(parameter.Evaluate);

if (!items.Any())
break;
}
}
return items;
}


dove SearchParameter é una classe astratta che fondamentalmente espone un metodo astratto la cui firma é

bool Evaluate(T arg)

considera peró che io lavoro su L2Objects. Anche se dovrebbe funzionare anche su L2Entities, bada solo che i "parametri" usino funzioni note al motore di query =)

(se il capo sgama sto snippet postato qui mi fa il culo :sofico:)

RaouL_BennetH
12-10-2010, 13:04
per applicare un numero variabile di filtri devi passare dalla scrittura "a query" a quella "a funzioni" (non ricordo i nomi "ufficiali", ma spero che mi capisci)

noi usiamo qualcosa tipo:


public static IEnumerable<T> Search<T>(this IEnumerable<T> source, IEnumerable<SearchParameter> parameters, SearchContext context)
where T : ISearchObject<T>
{
var items = source;

if (items != null)
{
foreach (SearchParameter parameter in parameters)
{
items = items.Where(parameter.Evaluate);

if (!items.Any())
break;
}
}
return items;
}


dove SearchParameter é una classe astratta che fondamentalmente espone un metodo astratto la cui firma é

bool Evaluate(T arg)

considera peró che io lavoro su L2Objects. Anche se dovrebbe funzionare anche su L2Entities, bada solo che i "parametri" usino funzioni note al motore di query =)

(se il capo sgama sto snippet postato qui mi fa il culo :sofico:)

Wow! grazie mille !!!

E' quindi lo stesso identico principio dei predicati ?

RaouL_BennetH
15-10-2010, 09:02
In questo contesto, è sbagliato usare la reflection ?

io ho 'firmato' in questo modo:



bool Match(TEntity entity)
{
if(entity.GetType().GetProperty(evaluatedPropertyName).GetValue(entity, null).ToString().Contains(someString))
return true;
return false;
}



?

RaouL_BennetH
15-10-2010, 10:40
Mamma mia, ci sono tanti strumenti a disposizione che mi sto perdendo :D


allora:



var results = myContext.myObject.ToList().FindAll(o => o.Proprietà.Contains("abc"));



E' possibile assegnare un valore a runtime a Proprietà ?

RaouL_BennetH
15-10-2010, 11:14
combinando insieme le cose:



public class ViewContext<TEntity>
{
public static bool Match(string dataPropertyName, string filter, TEntity entity)
{
if(typeof(TEntity).GetProperty(dataPropertyName).GetValue(entity, null).ToString().Contains(filter))

return true;
return false;
}

////

var results = context.MyObject.ToList().FindAll(obj =>
ViewContext<MyOBject>.Match(runtimeString, runtimeFilter, obj));

whatEverBindingOrDataSource.DataSource = results;


Vorrei sottolineare che questi sono soltanto i miei primi approcci didattici verso EF... (non vorrei finire sul daily WTF :D )