public static void Main()
StringBuilder whereClause = new StringBuilder();
new Filter { Name = "Prop0", Value = "null", Operator = "=" },
new Filter { Name = "Prop1", Value = 2, Operator = "=" },
new Filter { Name = "Prop2", Value = "text", Operator = "LIKE" }
for (int i = 0; i < array.Length; i++)
var exp = ExpressionFactory.GetBy(filter);
whereClause.Append(exp.GetExpressionStr(filter, i));
whereClause.Append(" AND ");
Console.WriteLine(whereClause);
public static class ExpressionFactory
private static StandardExpression _standardExpression = new StandardExpression();
private static ICustomExpression[] _specialExpressions = new []
(ICustomExpression)new NullExpression(),
(ICustomExpression)new LikeExpression()
public static ICustomExpression GetBy(Filter filter)
var match = _specialExpressions.SingleOrDefault(e => e.ExpressionIsValid(filter));
return _standardExpression;
private string _operator = "=";
public string Name { get; set; }
public object Value { get; set; }
public string Operator { get { return _operator; } set { _operator = value; } }
public interface ICustomExpression
bool ExpressionIsValid(Filter filter);
string GetExpressionStr(Filter filter, int index);
public class StandardExpression : ICustomExpression
public bool ExpressionIsValid(Filter filter)
public string GetExpressionStr(Filter filter, int index)
return filter.Name + " " + filter.Operator + " @" + index;
public class LikeExpression : ICustomExpression
public bool ExpressionIsValid(Filter filter)
return filter.Operator.ToLower().Equals("like");
public string GetExpressionStr(Filter filter, int index)
return filter.Name + ".Contains(@" + index + ")";
public class NullExpression : ICustomExpression
public bool ExpressionIsValid(Filter filter)
return filter.Value.ToString().ToLower().Equals("null");
public string GetExpressionStr(Filter filter, int index)
return filter.Name + " " + filter.Operator + " null ";