public static List <UoWCriteria> CriteriaOutputForm(CslaObjectInfo info, UnitOfWorkFunction function, bool generatingCriteria)
        {
            var result = new List <UoWCriteria>();

            var propertyDeclarationCache = new Dictionary <string, PropertyDeclaration>();

            foreach (var uowProperty in info.UnitOfWorkProperties)
            {
                propertyDeclarationCache[uowProperty.TypeName] = uowProperty.DeclarationMode;
            }

            var criteriaCollectionCounter = 0;

            foreach (var criteriaCollection in info.UnitOfWorkCriteriaObjects)
            {
                var creatorCounter = criteriaCollection.Count(crit => crit.IsCreator);

                if (function == UnitOfWorkFunction.Creator)
                {
                    if (creatorCounter == 0)
                    {
                        continue;
                    }
                }
                else if (function == UnitOfWorkFunction.Getter)
                {
                    if (creatorCounter != 0)
                    {
                        continue;
                    }
                }

                var uowCriteria = new UoWCriteria();
                criteriaCollectionCounter++;

                foreach (var crit in criteriaCollection)
                {
                    if (function == UnitOfWorkFunction.Creator && (!crit.IsCreator && (crit.IsGetter &&
                                                                                       CslaTemplateHelperCS.IsEditableType(crit.ParentObject.ObjectType))))
                    {
                        break;
                    }
                    if (function == UnitOfWorkFunction.Getter && !crit.IsGetter)
                    {
                        break;
                    }
                    if (function == UnitOfWorkFunction.Deleter && !crit.IsDeleter)
                    {
                        break;
                    }

                    var elementCriteria = new ElementCriteria();
                    elementCriteria.ParentObject    = crit.ParentObject.ObjectName;
                    elementCriteria.DeclarationMode = propertyDeclarationCache[elementCriteria.ParentObject];
                    elementCriteria.IsGetter        = !CslaTemplateHelperCS.IsEditableType(crit.ParentObject.ObjectType);
                    if (crit.Properties.Count == 0)
                    {
                        uowCriteria.ElementCriteriaList.Add(elementCriteria);
                    }
                    else
                    {
                        elementCriteria.Name      = crit.Name;
                        elementCriteria.Namespace = GetElementCriteriaNamesapce(crit);
                        elementCriteria.Type      = crit.Name;
                        if (crit.Properties.Count == 1)
                        {
                            elementCriteria.Name = crit.Properties[0].Name;
                            elementCriteria.Type =
                                CslaTemplateHelperCS.GetDataTypeGeneric(crit.Properties[0], crit.Properties[0].PropertyType);
                        }
                        if (generatingCriteria)
                        {
                            var newElementCriteria = new ElementCriteria();
                            foreach (var prop in crit.Properties.Where(prop => !string.IsNullOrEmpty(prop.UnitOfWorkFactoryParameter)))
                            {
                                newElementCriteria.ParentObject    = elementCriteria.Parameter;
                                newElementCriteria.DeclarationMode = elementCriteria.DeclarationMode;
                                newElementCriteria.IsGetter        = elementCriteria.IsGetter;
                                newElementCriteria.Namespace       = elementCriteria.Namespace;
                                newElementCriteria.Type            = "bool";
                                newElementCriteria.Name            = "Create" + elementCriteria.ParentObject;
                            }
                            uowCriteria.ElementCriteriaList.Add(newElementCriteria);
                        }
                        else
                        {
                            foreach (var prop in crit.Properties.Where(prop => !string.IsNullOrEmpty(prop.UnitOfWorkFactoryParameter)))
                            {
                                if (!string.IsNullOrEmpty(elementCriteria.Parameter))
                                {
                                    elementCriteria.Parameter += ", ";
                                }
                                elementCriteria.Parameter += prop.UnitOfWorkFactoryParameter;
                            }
                        }
                        uowCriteria.ElementCriteriaList.Add(elementCriteria);
                    }
                }
                var elementCriteriaListCount = uowCriteria.ElementCriteriaList.Count(elementCriteria => !string.IsNullOrEmpty(elementCriteria.Name));
                if ((generatingCriteria && elementCriteriaListCount > 1) ||
                    (!generatingCriteria && elementCriteriaListCount > 0))
                {
                    uowCriteria.CriteriaName = GetNumberedCriteria(info.UnitOfWorkCriteriaObjects.Count, criteriaCollectionCounter);
                }
                else
                {
                    criteriaCollectionCounter--;
                }

                if (uowCriteria.ElementCriteriaList.Count > 0)
                {
                    result.Add(uowCriteria);
                }
            }

            return(result);
        }
 public static List <UoWCriteria> CriteriaOutputForm(CslaObjectInfo info, UnitOfWorkFunction function)
 {
     return(CriteriaOutputForm(info, function, false));
 }