private static CriteriaPropertyCollection GetFakeCreateCriteria(CslaObjectInfo info, int createIndex)
        {
            var isCSharp = GeneratorController.Current.CurrentUnit.GenerationParams.OutputLanguage == CodeLanguage.CSharp;
            var result   = new CriteriaPropertyCollection();
            var index    = 0;

            foreach (var crit in info.CriteriaObjects)
            {
                if (crit.IsGetter && !crit.IsCreator)
                {
                    index++;
                    if (index == createIndex)
                    {
                        var criteriaPropertyCollection = CriteriaPropertyCollection.Clone(crit.Properties);
                        foreach (var criteriaProperty in criteriaPropertyCollection)
                        {
                            if (isCSharp)
                            {
                                criteriaProperty.UnitOfWorkFactoryParameter = "true, " +
                                                                              CslaTemplateHelperCS.GetDataTypeInitExpression(criteriaProperty, criteriaProperty.PropertyType);
                            }
                            else
                            {
                                criteriaProperty.UnitOfWorkFactoryParameter = "true, " +
                                                                              CslaTemplateHelperVB.GetDataTypeInitExpression(criteriaProperty, criteriaProperty.PropertyType);
                            }
                        }
                        result.AddRange(criteriaPropertyCollection);
                        break;
                    }
                }
            }
            return(result);
        }
        public static List <UoWCriteria> CriteriaOutputForm(CslaObjectInfo info, UnitOfWorkFunction function, bool generatingCriteria)
        {
            var isCSharp = GeneratorController.Current.CurrentUnit.GenerationParams.OutputLanguage == CodeLanguage.CSharp;
            var result   = new List <UoWCriteria>();
            var propertyDeclarationCache = new Dictionary <string, PropertyDeclaration>();
            var propertyNameCache        = new Dictionary <string, string>();

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

            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 &&
                                                                                       crit.ParentObject.ObjectType.IsEditableType())))
                    {
                        break;
                    }
                    if (function == UnitOfWorkFunction.Getter && !crit.IsGetter)
                    {
                        break;
                    }
                    if (function == UnitOfWorkFunction.Deleter && !crit.IsDeleter)
                    {
                        break;
                    }

                    var elementCriteria = new ElementCriteria
                    {
                        ParentObject = crit.ParentObject.ObjectName
                    };
                    elementCriteria.PropertyName    = propertyNameCache[elementCriteria.ParentObject];
                    elementCriteria.DeclarationMode = propertyDeclarationCache[elementCriteria.ParentObject];
                    elementCriteria.IsGetter        = !crit.ParentObject.ObjectType.IsEditableType();
                    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;
                            if (isCSharp)
                            {
                                elementCriteria.Type = CslaTemplateHelperCS.GetDataTypeGeneric(crit.Properties[0],
                                                                                               crit.Properties[0].PropertyType);
                            }
                            else
                            {
                                elementCriteria.Type = CslaTemplateHelperVB.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;
                                if (isCSharp)
                                {
                                    newElementCriteria.Type = CslaTemplateHelperCS.GetDataType(TypeCodeEx.Boolean);
                                }
                                else
                                {
                                    newElementCriteria.Type = CslaTemplateHelperVB.GetDataType(TypeCodeEx.Boolean);
                                }
                                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);
        }