public CamlExpression GetExpression(Func <SPModelQueryFieldInfo, CamlExpression> expressionFactory, bool checkOrderable)
        {
            CommonHelper.AccessNotNull(expressionFactory, "expressionFactory");

            if (this.FieldAssociations == null)
            {
                CommonHelper.AccessNotNull(this.Field.FieldRef, "FieldRef");
                return(expressionFactory(this.Field));
            }
            if (!this.FieldAssociations.Queryable)
            {
                throw new Exception(String.Format("Member '{0}' must have exactly one SPFieldAttribute with IncludeInQuery set to true", this.Member.Name));
            }
            if (this.FieldAssociations.Fields.Count > 1 && checkOrderable)
            {
                throw new Exception(String.Format("Member '{0}' cannot be used in ordering", this.Member.Name));
            }
            CamlExpression expression = Caml.False;

            foreach (SPModelFieldAssociation association in this.FieldAssociations)
            {
                SPModelQueryFieldInfo fieldInfo = new SPModelQueryFieldInfo(visitor.Manager.Site, association);
                if (this.FieldAssociations.Fields.Count == 1)
                {
                    return(expressionFactory(fieldInfo));
                }
                expression |= (association.Descriptor.GetContentTypeExpression(visitor.Manager.Descriptor) + expressionFactory(fieldInfo));
            }
            return(expression);
        }
示例#2
0
        private CamlExpression HandleEqualityComparison(SPModelQueryFieldInfo s, CamlBinaryOperator op)
        {
            ICamlParameterBinding value      = currentScope.GetValueBinding(s);
            CamlExpression        expression = new CamlWhereBinaryComparisonExpression(op, s.FieldRef, value);
            Type memberType = currentScope.MemberType;

            if (memberType.IsGenericType && memberType.GetGenericTypeDefinition() == typeof(Nullable <>))
            {
                memberType = memberType.GetGenericArguments()[0];
            }
            if (memberType.IsValueType || memberType == typeof(string))
            {
                string defaultValue = value.Bind(new Hashtable {
                    { currentScope.ParameterName, memberType.IsValueType ? memberType.GetDefaultValue() : "" }
                });
                CamlExpression lateBoundCond = new CamlLateBoundDefaultValueAsNullExpression(s.FieldRef, value, defaultValue);
                return(op == CamlBinaryOperator.Eq ? expression | lateBoundCond : expression& ~lateBoundCond);
            }
            return(expression);
        }
        private CamlExpression HandleNullExpression(SPModelQueryFieldInfo field, bool negate)
        {
            CamlExpression expression = Caml.IsNull(field.FieldRef);

            if (field.FieldTypeAsString == "TaxonomyFieldType" || field.FieldTypeAsString == "TaxonomyFieldTypeMulti")
            {
                SPList taxonomyHiddenList = SPExtensionHelper.GetTaxonomyHiddenList(manager.Site);
                foreach (SPListItem item in taxonomyHiddenList.GetItems("IdForTerm"))
                {
                    if (manager.TermStore.GetTerm(new Guid((string)item["IdForTerm"])) == null)
                    {
                        expression |= Caml.LookupIdEquals(field.FieldRef, item.ID);
                    }
                }
            }
            if (negate)
            {
                return(~expression);
            }
            return(expression);
        }
 public ICamlParameterBinding GetValueBinding(SPModelQueryFieldInfo s)
 {
     return(CamlParameterBinding.GetValueBinding(visitor.Manager.Site, s.FieldType, s.FieldTypeAsString, s.IncludeTimeValue, this.MemberType, this.Value));
 }