using System.Collections.Generic;
using System.Linq.Expressions;
public interface IFilter<T>{
IQueryable<T> ApplicaFiltro(IQueryable<T> collezione);
public int IdCliente {get;set;}
public string Nome {get;set;}
public bool ClienteVip {get;set;}
public static IEnumerable<Cliente> RicercaClienti(IFilter<Cliente> filtro){
new Cliente { IdCliente = 1, Nome = "Mario Rossi", ClienteVip = false },
new Cliente { IdCliente = 2, Nome = "Luigi Verdi", ClienteVip = true },
new Cliente { IdCliente = 3, Nome = "Enzo Neri", ClienteVip = false },
return filtro.ApplicaFiltro(clienti).AsEnumerable();
public class FiltroClienti : IFilter<Cliente> {
private readonly Expression<Func<Cliente, bool>> espressioneFiltro;
public FiltroClienti(Expression<Func<Cliente, bool>> espressioneFiltro){
this.espressioneFiltro = espressioneFiltro;
public IQueryable<Cliente> ApplicaFiltro(IQueryable<Cliente> collezioneClienti){
return collezioneClienti.Where(espressioneFiltro);
public static void Main()
Expression<Func<Cliente, bool>> espressioneFiltro = cliente => cliente.ClienteVip == true;
var filtro = new FiltroClienti(espressioneFiltro);
var clientiFiltrati = RicercaClienti(filtro);
foreach (var cliente in clientiFiltrati){
Console.WriteLine(cliente.Nome);