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 )
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.