internal void AddCriteria(tridion.Criteria crit)
 {
     if(Criteria == null)
     {
         Criteria = new List<tridion.Criteria>();
     }
     Criteria.Add(crit);
 }
 /// <summary>
 /// Binds the SortColumn to the Tridion Query based on the expression(s) provided
 /// </summary>
 /// <param name="m"></param>
 /// <param name="expression"></param>
 /// <param name="p"></param>
 /// <param name="orderType"></param>
 /// <returns></returns>
 private Expression BindOrderBy(MethodCallExpression m, Expression expression, LambdaExpression p, tridion.SortDirection orderType)
 {
     this.Visit(expression);
     if (p.Body is MemberExpression)
     {
         MemberExpression MemberExp = (MemberExpression)p.Body;
         string SortFieldName = MemberExp.Member.Name;
         switch (SortFieldName)
         {
             case "ComponentSchema":
                 sort.Add(new tridion.SortParameter(new tridion.ComponentSchemaColumn(), orderType));
                 break;
             case "ItemCreationDate":
                 sort.Add(new tridion.SortParameter(new tridion.ItemCreationDateColumn(), orderType));
                 break;
             case "ItemId":
                 sort.Add(new tridion.SortParameter(new tridion.ItemIdColumn(), orderType));
                 break;
             case "ItemInitialPublication":
                 sort.Add(new tridion.SortParameter(new tridion.ItemInitialPublicationColumn(), orderType));
                 break;
             case "ItemLastPublish":
                 sort.Add(new tridion.SortParameter(new tridion.ItemLastPublishColumn(), orderType));
                 break;
             case "ItemMajorVersion":
                 sort.Add(new tridion.SortParameter(new tridion.ItemMajorVersionColumn(), orderType));
                 break;
             case "ItemMinorVersion":
                 sort.Add(new tridion.SortParameter(new tridion.ItemMinorVersionColumn(), orderType));
                 break;
             case "ItemOwningPublication":
                 sort.Add(new tridion.SortParameter(new tridion.ItemOwningPublicationColumn(), orderType));
                 break;
             case "ItemPublication":
                 sort.Add(new tridion.SortParameter(new tridion.ItemPublicationColumn(), orderType));
                 break;
             case "ItemTitle":
                 sort.Add(new tridion.SortParameter(new tridion.ItemTitleColumn(), orderType));
                 break;
             case "ItemTrustee":
                 sort.Add(new tridion.SortParameter(new tridion.ItemTrusteeColumn(), orderType));
                 break;
             case "ItemType":
                 sort.Add(new tridion.SortParameter(new tridion.ItemTypeColumn(), orderType));
                 break;
             case "PageFilename":
                 sort.Add(new tridion.SortParameter(new tridion.PageFilenameColumn(), orderType));
                 break;
             case "PageTemplate":
                 sort.Add(new tridion.SortParameter(new tridion.PageTemplateColumn(), orderType));
                 break;
             case "PageURL":
                 sort.Add(new tridion.SortParameter(new tridion.PageURLColumn(), orderType));
                 break;
             default:
                 // Assume Metadata as SortColumn, it has to be attributed with a metadata aatribute and defined as metadata in the schema within Tridion
                 if (CheckMemberAttributes(MemberExp.Member))
                 {
                     // Check the type of the SortFieldName
                     switch (Type.GetTypeCode(MemberExp.Type))
                     {
                         case TypeCode.String:
                             sort.Add(new tridion.SortParameter(new tridion.CustomMetaKeyColumn(SortFieldName, tridion.MetadataType.STRING), orderType));
                             break;
                         case TypeCode.Boolean:
                         case TypeCode.Byte:
                         case TypeCode.Decimal:
                         case TypeCode.Double:
                         case TypeCode.Int16:
                         case TypeCode.Int32:
                         case TypeCode.Int64:
                         case TypeCode.SByte:
                         case TypeCode.Single:
                         case TypeCode.UInt16:
                         case TypeCode.UInt32:
                         case TypeCode.UInt64:
                             sort.Add(new tridion.SortParameter(new tridion.CustomMetaKeyColumn(SortFieldName, tridion.MetadataType.FLOAT), orderType));
                             break;
                         case TypeCode.DateTime:
                             sort.Add(new tridion.SortParameter(new tridion.CustomMetaKeyColumn(SortFieldName, tridion.MetadataType.DATE), orderType));
                             break;
                         default:
                             // Unknown MetadataSortField provided
                             throw new NotSupportedException(string.Format("The MetadataSortField type '{0}' for '{1}' is not supported", Type.GetTypeCode(MemberExp.Member.DeclaringType), SortFieldName));
                     }
                 }
                 else
                 {
                     throw new NotSupportedException(string.Format("Unknown SortColumn '{0}' defined", ((MemberExpression)p.Body).Member.Name));
                 }
                 break;
         }
     }
     this.Visit(p.Body);
     return m;
 }