public class ProcessFilters {
ParameterExpression paramExp;
Expression bodyFilter;
public ProcessFilters() {
paramExp = Expression.Parameter(typeof(Process), "p");
bodyFilter = null;
}

// Vytvoen vrazu lambda  vdy mme jeden parametr typu 
// Process, kter je deklarovn jako paramExp v konstruktoru.
public Expression<Func<Process, bool>> GetExpression() {
if (bodyFilter == null) {
	return null;
}
Expression<Func<Process, bool>> filter;
filter = Expression.Lambda<Func<Process, bool>>(
bodyFilter,
new ParameterExpression[] { paramExp });
return filter;
}

// Pidme operaci AND a filtr porovnvajc hodnotu fieldName 
// s hodnotou comparisonValue pomoc potebnho opertoru.
public void Add( string fieldName,
ExpressionType comparisonOperator,
object comparisonValue) {
switch (comparisonOperator) {
case ExpressionType.Equal:
case ExpressionType.NotEqual:
case ExpressionType.LessThan:
case ExpressionType.LessThanOrEqual:
case ExpressionType.GreaterThan:
case ExpressionType.GreaterThanOrEqual:
	// konec podporovanch opertor;
default:
throw new NotSupportedException(
String.Format(
"Opertor {0} nen metodou ProcessFilters.Add podporovn.",
comparisonOperator.ToString()));
} // konec pkazu switch (rozhodovn podle comparisonOperator)

ConstantExpression comparisonConstant =
	Expression.Constant( comparisonValue,
										comparisonValue.GetType());
MemberExpression fieldAccess =
	Expression.Property( paramExp,
										fieldName);
BinaryExpression comparison =
	Expression.MakeBinary( comparisonOperator,
fieldAccess,
comparisonConstant );
if (bodyFilter == null) {
	bodyFilter = comparison;
}
else {
	bodyFilter = Expression.AndAlso(bodyFilter, comparison);
}
}
}
