Here is my code:
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.Objects;
using Infrastructure.Querying;
namespace Repositories.EF.QueryTranslators
{
public class QueryTranslator
{
private int ParameterCounter = 1;
public string CurrentParameterNr { get { return "p" + ParameterCounter++.ToString(); } }
public void CreateQueryAndObjectParameters(Query query, StringBuilder queryBuilder, IList<ObjectParameter> paraColl)
{
IList<string> criteriaStringList = new List<string>();
if (query.Criteria != null)
{
foreach (Criterion criterion in query.Criteria)
{
string currentParameterNr = CurrentParameterNr;
switch (criterion.criteriaOperator)
{
case CriteriaOperator.Equal:
criteriaStringList.Add(String.Format("it.{0} = @{1}", criterion.PropertyName, currentParameterNr));
break;
case CriteriaOperator.LessThanOrEqual:
criteriaStringList.Add(String.Format("it.{0} <= @{1}", criterion.PropertyName, currentParameterNr));
break;
case CriteriaOperator.LessThan:
criteriaStringList.Add(String.Format("it.{0} < @{1}", criterion.PropertyName, currentParameterNr));
break;
case CriteriaOperator.HigherThanOrEqual:
criteriaStringList.Add(String.Format("it.{0} >= @{1}", criterion.PropertyName, currentParameterNr));
break;
case CriteriaOperator.HigherThan:
criteriaStringList.Add(String.Format("it.{0} > @{1}", criterion.PropertyName, currentParameterNr));
break;
default:
throw new ApplicationException("No operator defined");
}
paraColl.Add(new ObjectParameter(currentParameterNr, criterion.Value));
}
string queryOperator;
if (query.QueryOperator == QueryOperator.And) queryOperator = " and ";
else queryOperator = " or ";
queryBuilder.Append(String.Join(queryOperator, criteriaStringList));
foreach (Query subQuery in query.SubQueries)
{
queryBuilder.Append(queryOperator);
queryBuilder.Append(" (");
CreateQueryAndObjectParameters(subQuery, queryBuilder, paraColl);
queryBuilder.Append(") ");
}
}
}
}
}
Obviously not the best solution, but it works. Since I'm not satisfied with a solution that just works I would be glad if anyone could help me find a more elegant way ;-)