/// <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); }
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); }
/// <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())); }
/// <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); }
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)); }
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); }
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); }
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)); }
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); }
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)); }
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."); }