Skip to content

Instantly share code, notes, and snippets.

@MeoMix
Created October 10, 2012 21:39
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save MeoMix/0b29592051c85c5fb620 to your computer and use it in GitHub Desktop.
Save MeoMix/0b29592051c85c5fb620 to your computer and use it in GitHub Desktop.
public IList<Task> GetByWorkflowFilterCriteria(IList<WorkflowFilterCriteria> workflowFilterCriterias)
{
var criteria = NHibernateSession
.CreateCriteria(typeof(Task), "Task")
.CreateCriteria("Task.Order", "Order")
.CreateAlias("Task.TaskDevice", "TaskDevice");
AbstractCriterion taskAttributeCriteria = null;
foreach (var queryAttribute in workflowFilterCriterias)
{
Attribute attribute = AttributeCache.Instance.GetByID(queryAttribute.AttributeID);
if (attribute != null)
{
string field = string.Format("{0}.{1}", attribute.Entity, attribute.EntityProperty);
if (attribute.Entity == "TaskAttribute")
field = "TaskAttribute.Value";
// Must convert values to objects otherwise hibernate does type checking between the filter value
// (will always be a string) and the database field type
object value1 = queryAttribute.Value1;
if (attribute.DataType == AttributeDataType.Numeric)
{
int value = 0;
if (Int32.TryParse(queryAttribute.Value1, out value))
value1 = value;
}
else if (attribute.DataType == AttributeDataType.Date)
{
value1 = null;
DateTime dateTime;
if (queryAttribute.Value1 == "1/1/1")
value1 = DateTime.Now;
else if (DateTime.TryParse(queryAttribute.Value1, out dateTime))
value1 = dateTime;
}
object value2 = queryAttribute.Value2;
if (attribute.DataType == AttributeDataType.Numeric)
{
int value = 0;
if (Int32.TryParse(queryAttribute.Value2, out value))
value2 = value;
}
else if (attribute.DataType == AttributeDataType.Date)
{
value2 = null;
DateTime dateTime;
if (queryAttribute.Value2 == "1/1/1")
value2 = DateTime.Now;
else if (DateTime.TryParse(queryAttribute.Value2, out dateTime))
value2 = dateTime;
}
// For CSV values
var values = queryAttribute.Value1.Split(',').ToList().Select(x => x.Trim()).ToList();
AbstractCriterion expression = null;
if (queryAttribute.Comparator == WorkflowFilterComparator.Like)
expression = Restrictions.Like(field, value1);
else if (queryAttribute.Comparator == WorkflowFilterComparator.NotLike)
expression = Restrictions.Not(Restrictions.Like(field, value1));
else if (queryAttribute.Comparator == WorkflowFilterComparator.In)
expression = Restrictions.In(field, values);
else if (queryAttribute.Comparator == WorkflowFilterComparator.NotIn)
expression = Restrictions.Not(Restrictions.Like(field, values));
else if (queryAttribute.Comparator == WorkflowFilterComparator.Eq)
expression = Restrictions.Eq(field, value1);
else if (queryAttribute.Comparator == WorkflowFilterComparator.Ne)
expression = Restrictions.Not(Restrictions.Eq(field, value1));
else if (queryAttribute.Comparator == WorkflowFilterComparator.Between && values.Count > 1)
expression = Restrictions.Between(field, values[0], values[1]);
else if (queryAttribute.Comparator == WorkflowFilterComparator.Ge)
expression = Restrictions.Ge(field, value1);
else if (queryAttribute.Comparator == WorkflowFilterComparator.Le)
expression = Restrictions.Le(field, value1);
if (attribute.Entity == "TaskAttribute")
{
// This seems to be the only way I can chain Ands
if (taskAttributeCriteria == null)
taskAttributeCriteria = Restrictions.And(
Restrictions.Eq("TaskAttribute.AttributeID", attribute.ID),
expression);
else
taskAttributeCriteria = Restrictions.And(Restrictions.And(
Restrictions.Eq("TaskAttribute.AttributeID", attribute.ID),
expression), taskAttributeCriteria);
}
else
{
criteria.Add(expression);
}
}
}
if (taskAttributeCriteria != null)
{
criteria.CreateCriteria("Task.TaskAttributes", "TaskAttribute");
criteria.Add(taskAttributeCriteria);
}
return criteria.List<Task>();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment