Attualmente sto utilizzando il framework Entity, ma si tratta di un problema "condiviso" tra tutti gli ORM e persino IEnumerable.Come filtrare IEnumerable in base a un parametro di input dell'entità
Diciamo che ho un metodo MVC si presenta così:
[HttpPost]
public ActionResult Foo(FooModel model)
{
var context = new Context(); -- The EF session
var data = context.Foo.Where(???).ToList();
return View(data);
}
voglio interrogare il contesto in base al parametro di ingresso come:
var data = context.Foo.Where(x => x.Date == model.Date &&
x.Name == model.Name &&
x.ItemCode = model.ItemCode).ToList();
ma è più complicato di così, perché se uno dei parametri sopra (Date
\ Name
\ ItemCode
) è nullo, non voglio includerlo all'interno della query.
Se ho codificare il possibile simile a questo:
var query = context.Foo;
if (model.Date != null)
query =query.Where(x => x.Date == model.Date);
if (model.ItemCode != null)
query =query.Where(x => x.ItemCode == model.ItemCode);
...
Ci deve essere un modo più semplice di questo.
Ho bisogno di un modo per generare un'espressione del tipo Expression<T, bool>
da utilizzare nel metodo Dove.
[HttpPost]
public ActionResult Foo(FooModel model)
{
var context = new Context(); -- The EF session
var data = context.Foo.Where(THE_EXPRESSION).ToList();
return View(data);
}
Esiste un modo integrato per creare quell'espressione? C'è un pacchetto in nuget che lo fa?
Aggiornamento: Ci potrebbero essere più di 30 properites nel modello-entità; scrivere 30 volte il Dove per ogni domanda può essere un dolore al collo:
.Where(model.Date != null, x => x.Date == model.Date)
.Where(model.Name != null, x => x.Name == model.Name)
.Where(model.ItemCode != null, x => x.ItemCode == model.ItemCode)
...
...
...
.ToList();
Un esempio che mostra come verrà utilizzato questo metodo sarà molto utile. – devinbost