Esempio n. 1
0
        /// <summary>
        /// Sets ViewFields used in CAML query
        /// </summary>
        /// <param name="selectors">Expressions indicates properties used as view fields</param>
        /// <returns>Fluent instance of that class</returns>
        public CamlQuery ViewFields <T>(params Expression <Func <T, object> >[] selectors) where T : Item
        {
            var memVisitor = new MemberAccessVisitor();

            ViewFieldsStore = selectors.Select(memVisitor.GetMemberName).ToArray();
            return(this);
        }
        protected Func <T> property <T>(string name, Expression <Func <T> > expr)
        {
            Console.WriteLine($"Creating computed property for expression {expr}");

            var visitor = new MemberAccessVisitor(GetType());

            visitor.Visit(expr);

            if (visitor.PropertyNames.Any())
            {
                if (!affectedBy.ContainsKey(name))
                {
                    affectedBy.Add(name, new HashSet <string>());
                }

                foreach (var propName in visitor.PropertyNames)
                {
                    if (propName != name)
                    {
                        affectedBy[name].Add(propName);
                    }
                }
            }

            return(expr.Compile());
        }
        public static MemberAccess <TReturn> get_ <T, TReturn>(this TypedExpression <T> target,
                                                               Expression <Func <T, TReturn> > getter)
        {
            var visitor = MemberAccessVisitor.GetProperty(getter);

            return(new MemberAccess <TReturn>(Expression.MakeMemberAccess(target, visitor)));
        }
            public static PropertyInfo GetProperty(Expression expression)
            {
                var visitor = new MemberAccessVisitor();

                visitor.Visit(expression);
                return(visitor._pi);
            }
Esempio n. 5
0
        private static string GetFieldName<T>(Expression<Func<T, object>> selector)
        {
            var visitor = new MemberAccessVisitor();
            string propName = visitor.GetMemberName(selector);

            var fieldName = FieldMapper.TranslateToFieldName(propName);

            var type = typeof(T);
            var property = type.GetProperty(propName);
            var attrs = property.GetCustomAttributes(typeof(FieldAttribute), false);

            if (attrs.Length != 0)
            {
                var attr = (FieldAttribute)attrs[0];
                if (attr.Name != null)
                    fieldName = attr.Name;
            }
            
            if (CommonHelper.IsPropertyNotMapped(property))
            {
                // allow to use FieldRef<Document>(d => d.Name)
                if (propName != "Name")
                {
                    throw new SharepointCommonException("Cannot use FieldRef<> with property marked as 'NotField'");
                }
            }

            return fieldName;
        }
        internal static string GetFieldInnerName <T>(Expression <Func <T, object> > fieldSelector) where T : Item, new()
        {
            if (fieldSelector == null)
            {
                throw new ArgumentNullException("fieldSelector");
            }

            var    memberAccessor = new MemberAccessVisitor();
            string propName       = memberAccessor.GetMemberName(fieldSelector);

            var prop = typeof(T).GetProperty(propName);

            var fieldAttrs = prop.GetCustomAttributes(typeof(FieldAttribute), true);

            if (fieldAttrs.Length != 0)
            {
                var spPropName = ((FieldAttribute)fieldAttrs[0]).Name;
                if (spPropName != null)
                {
                    propName = spPropName;
                }
            }
            else
            {
                propName = FieldMapper.TranslateToFieldName(propName);
            }

            return(propName);
        }
Esempio n. 7
0
        /// <summary>
        /// Gets Name property of FieldAttribute if marked with, else returns choice field name
        /// </summary>
        /// <typeparam name="T">type of entity</typeparam>
        /// <param name="self">instance of entity</param>
        /// <param name="fieldSelector">expression to select entity property which text need get</param>
        /// <returns>Name property of FieldAttribute</returns>
        public static string GetChoice <T>(this T self, Expression <Func <T, object> > fieldSelector) where T : Item, new()
        {
            if (fieldSelector == null)
            {
                throw new ArgumentNullException("fieldSelector");
            }
            var    memberAccessor = new MemberAccessVisitor();
            string propName       = memberAccessor.GetMemberName(fieldSelector);

            var prop  = typeof(T).GetProperty(propName);
            var value = prop.GetValue(self, null);

            if (value == null)
            {
                return(null);
            }

            var enumType = prop.PropertyType;

            if (enumType.IsEnum == false)
            {
                if (CommonHelper.ImplementsOpenGenericInterface(prop.PropertyType, typeof(Nullable <>)))
                {
                    Type argumentType = prop.PropertyType.GetGenericArguments()[0];
                    if (argumentType.IsEnum == false)
                    {
                        throw new SharepointCommonException("selected property not a choice(must be mapped as enum)");
                    }
                    enumType = argumentType;
                }
            }

            return(CommonHelper.GetChoiceValue(enumType, value.ToString()));
        }
Esempio n. 8
0
        /// <summary>
        /// Sets choice property by a text used in FieldAttribute.Name
        /// </summary>
        /// <typeparam name="T">type of entity</typeparam>
        /// <param name="self">instance of entity</param>
        /// <param name="fieldSelector">expression to select entity property which value need set</param>
        /// <param name="value">text used in FieldAttribute.Name</param>
        public static void SetChoice <T>(this T self, Expression <Func <T, object> > fieldSelector, string value) where T : Item, new()
        {
            if (fieldSelector == null)
            {
                throw new ArgumentNullException("fieldSelector");
            }

            var    memberAccessor = new MemberAccessVisitor();
            string propName       = memberAccessor.GetMemberName(fieldSelector);

            var prop     = typeof(T).GetProperty(propName);
            var enumType = prop.PropertyType;

            if (enumType.IsEnum == false)
            {
                if (CommonHelper.ImplementsOpenGenericInterface(prop.PropertyType, typeof(Nullable <>)))
                {
                    Type argumentType = prop.PropertyType.GetGenericArguments()[0];
                    if (argumentType.IsEnum == false)
                    {
                        throw new SharepointCommonException("selected property not a choice(must be mapped as enum)");
                    }
                    enumType = argumentType;
                }
            }

            ValueType val = null;

            foreach (ValueType v in Enum.GetValues(enumType))
            {
                var enumField = enumType.GetField(v.ToString());

                if (value == v.ToString())
                {
                    val = v;
                    break;
                }

                var attr = (FieldAttribute)Attribute.GetCustomAttribute(enumField, typeof(FieldAttribute));
                if (attr == null)
                {
                    continue;
                }

                if (attr.Name != null && attr.Name == value)
                {
                    val = v;
                    break;
                }
            }

            if (val == null)
            {
                throw new Exception("choice not found: " + value);
            }

            prop.SetValue(self, val, null);
        }
Esempio n. 9
0
        public virtual bool ContainsField(Expression <Func <T, object> > selector)
        {
            // get proprerty name
            var    memberAccessor = new MemberAccessVisitor();
            string propName       = memberAccessor.GetMemberName(selector);
            var    prop           = _entityType.GetProperty(propName);

            return(ContainsFieldImpl(prop));
        }
Esempio n. 10
0
        public virtual void EnsureField(Expression <Func <T, object> > selector)
        {
            // get proprerty name
            var    memberAccessor = new MemberAccessVisitor();
            string propName       = memberAccessor.GetMemberName(selector);

            var prop = _entityType.GetProperty(propName);

            var fieldType = FieldMapper.ToFieldType(prop);

            EnsureFieldImpl(fieldType);
        }
Esempio n. 11
0
        public virtual void Update(T entity, bool incrementVersion, params Expression <Func <T, object> >[] selectors)
        {
            if (entity == null)
            {
                throw new ArgumentNullException("entity");
            }

            var forUpdate = GetItemByEntity(entity);

            if (selectors == null || selectors.Length == 0)
            {
                EntityMapper.ToItem(entity, forUpdate);
                if (incrementVersion)
                {
                    forUpdate.Update();
                }
                else
                {
                    forUpdate.SystemUpdate(false);
                }

                InvalidateProperties(entity, null, forUpdate);
                return;
            }

            if (entity == null)
            {
                throw new SharepointCommonException(
                          string.Format("cant found item with ID={0} in List={1}", entity.Id, List.Title));
            }

            var propertiesToSet = new List <string>();
            var memberAccessor  = new MemberAccessVisitor();

            foreach (var selector in selectors)
            {
                string propName = memberAccessor.GetMemberName(selector);
                propertiesToSet.Add(propName);
            }

            EntityMapper.ToItem(entity, forUpdate, propertiesToSet);

            if (incrementVersion)
            {
                forUpdate.Update();
            }
            else
            {
                forUpdate.SystemUpdate(false);
            }

            InvalidateProperties(entity, propertiesToSet, forUpdate);
        }
Esempio n. 12
0
        private Tuple <string, string, bool> GenerateFullKey <TProperty>(string key, Expression <Func <T, TProperty> > propertyGetter, SyncOptions syncOptions)
        {
            var visitor = new MemberAccessVisitor();

            visitor.Visit(propertyGetter);
            var propertyType = typeof(TProperty).GetTypeInfo();

            // primitive types
            if (syncOptions == SyncOptions.Patch && (propertyType.IsPrimitive || Nullable.GetUnderlyingType(typeof(TProperty)) != null || typeof(TProperty) == typeof(string)))
            {
                return(Tuple.Create(key + "/" + string.Join("/", visitor.PropertyNames.Skip(1).Reverse()), visitor.PropertyNames.First(), true));
            }

            return(Tuple.Create(key + "/" + string.Join("/", visitor.PropertyNames.Reverse()), visitor.PropertyNames.First(), false));
        }
Esempio n. 13
0
        public virtual void UpdateField(T entity, Expression <Func <T, object> > fieldSelector, object valueToSet, bool incrementVersion = true)
        {
            if (fieldSelector == null)
            {
                throw new ArgumentNullException("fieldSelector");
            }
            var memberAccessor = new MemberAccessVisitor();
            var propName       = memberAccessor.GetMemberName(fieldSelector);

            var prop = entity.GetType().GetProperty(propName);

            prop.SetValue(entity, valueToSet, null);

            Update(entity, incrementVersion, fieldSelector);
        }
Esempio n. 14
0
        public virtual IEnumerable <T> ByField <TR>(Expression <Func <T, TR> > selector, TR value)
        {
            var    memberAccessor = new MemberAccessVisitor();
            string fieldName      = memberAccessor.GetMemberName(selector);


            var fieldInfo = FieldMapper.ToFields <T>().FirstOrDefault(f => f.Name.Equals(fieldName));

            if (fieldInfo == null && fieldName == "Name")
            {
                fieldInfo = new Field {
                    Type = SPFieldType.Text, Name = "FileLeafRef",
                };
            }

            if (fieldInfo == null)
            {
                throw new SharepointCommonException(string.Format("Field '{0}' not exist in '{1}'", fieldName, List.Title));
            }

            string fieldType = fieldInfo.Type.ToString();

            var camlByField = string.Empty;

            fieldName = fieldInfo.Name;

#pragma warning disable 612,618
            if (CommonHelper.IsNullOrDefault(value))
            {
                if (value is ValueType)
                {
                    camlByField = Q.Where(Q.Eq(Q.FieldRef(fieldName), Q.Value(default(TR).ToString())));
                }
                else
                {
                    camlByField = Q.Where(Q.IsNull(Q.FieldRef(fieldName)));
                }
            }
            else if (fieldInfo.Type == SPFieldType.User)
            {
                var user = value as User;
                int userId;

                if (user.Id != 0)
                {
                    userId = user.Id;
                }
                else
                {
                    var person = user as Person;
                    if (person != null)
                    {
                        try
                        {
                            var spUser = ParentWeb.Web.SiteUsers[person.Login];
                            userId = spUser.ID;
                        }
                        catch (SPException)
                        {
                            throw new SharepointCommonException(string.Format("Person {0} not found.", person.Login));
                        }
                    }
                    else
                    {
                        try
                        {
                            var group = ParentWeb.Web.SiteGroups[user.Name];
                            userId = @group.ID;
                        }
                        catch (SPException)
                        {
                            throw new SharepointCommonException(string.Format("Group {0} not found.", user.Name));
                        }
                    }
                }

                camlByField = Q.Where(Q.Eq(Q.FieldRef(fieldName, true), Q.Value(fieldType, userId.ToString())));
            }
            else if (fieldInfo.Type == SPFieldType.Lookup)
            {
                var item = value as Item;

                if (item.Id != 0)
                {
                    camlByField = Q.Where(Q.Eq(Q.FieldRef(fieldName, true), Q.Value(fieldType, item.Id.ToString())));
                }
                else if (item.Title != null)
                {
                    camlByField = Q.Where(Q.Eq(Q.FieldRef(fieldName), Q.Value(fieldType, item.Title)));
                }
                else
                {
                    throw new SharepointCommonException("Both Id and Title are null in search value");
                }
            }
            else
            {
                camlByField = Q.Where(Q.Eq(Q.FieldRef(fieldName), Q.Value(fieldType, value.ToString())));
            }
#pragma warning restore 612,618
            var itemsByField = ByCaml(List, camlByField);
            return(EntityMapper.ToEntities <T>(itemsByField));
        }
Esempio n. 15
0
        public TList Ensure <TList>(Expression <Func <T, TList> > listSelector)
        {
            var visitor = new MemberAccessVisitor();
            var selectedPropertyName = visitor.GetMemberName(listSelector);
            var selectedProperty     = typeof(T).GetProperty(selectedPropertyName);

            if (selectedProperty == null)
            {
                throw new SharepointCommonException(string.Format("property {0} not found!", selectedPropertyName));
            }
            var propertyType = selectedProperty.PropertyType;

            var listAttribute = (ListAttribute)Attribute.GetCustomAttribute(selectedProperty, typeof(ListAttribute));

            if (listAttribute != null && listAttribute.Id != null)
            {
                throw new SharepointCommonException("Cannot ensure list with ID. It may cause mapping problems.");
            }

            if (!CommonHelper.ImplementsOpenGenericInterface(propertyType, typeof(IQueryList <>)))
            {
                throw new SharepointCommonException("Ensure not IQueryList<> not supported yet!");
            }

            var  args         = propertyType.GetGenericArguments();
            var  isRepository = args.Length == 0;
            Type entityType;

            if (isRepository)
            {
                entityType = GetRepositoryGenericArgument(propertyType);
            }
            else
            {
                entityType = args[0];
            }

            if (listAttribute != null && !string.IsNullOrEmpty(listAttribute.Name))
            {
                if (QueryWeb.ExistsByName(listAttribute.Name))
                {
                    var qList = ((QueryWeb)QueryWeb).GetByName(entityType, listAttribute.Name);
                    if (!isRepository)
                    {
                        // existing list
                        return((TList)qList);
                    }
                    else
                    {
                        //existing repository
                        var splistProp1 = qList.GetType().GetProperty("List");
                        var splist1     = splistProp1.GetValue(qList, null);
                        return(CreateRepository <TList>(propertyType, splist1));
                    }
                }

                var list   = ((QueryWeb)QueryWeb).Create(entityType, selectedPropertyName);
                var splist = list.GetType().GetProperty("List").GetValue(list, null);

                list.GetType().GetProperty("Title").SetValue(list, listAttribute.Name, null);


                if (isRepository)
                {
                    //new repository
                    return(CreateRepository <TList>(propertyType, splist));
                }
                else
                {
                    //new list
                    return((TList)list);
                }
            }
            else if (listAttribute != null && listAttribute.Url != null)
            {
                var nameForCreateCorrectUrl = listAttribute.Url.Substring(
                    listAttribute.Url.LastIndexOf("/", StringComparison.Ordinal) + 1);

                if (QueryWeb.ExistsByUrl(listAttribute.Url))
                {
                    var existingList = ((QueryWeb)QueryWeb).GetByUrl(entityType, listAttribute.Url);

                    if (!isRepository)
                    {
                        // existing list
                        return((TList)existingList);
                    }
                    else
                    {
                        // existing repository
                        var splist1 = existingList.GetType().GetProperty("List").GetValue(existingList, null);
                        return(CreateRepository <TList>(propertyType, splist1));
                    }
                }

                var list   = ((QueryWeb)QueryWeb).Create(entityType, nameForCreateCorrectUrl);
                var splist = list.GetType().GetProperty("List").GetValue(list, null);
                list.GetType().GetProperty("Title").SetValue(list, selectedPropertyName, null);

                if (isRepository)
                {
                    // new repository
                    return(CreateRepository <TList>(propertyType, splist));
                }
                else
                {
                    // new list
                    return((TList)list);
                }
            }

            throw new SharepointCommonException("default case.");
        }