/// <summary> /// Constructs the filter /// </summary> /// <param name="dataValue"> /// DataValue used to link the local with the foreign DataObject /// </param> /// <param name="valueToCompare"> /// Foreign DataObject /// </param> public ForeignKeyFilter(DataType dtype, System.Reflection.MemberInfo member, object valueToCompare) { if (dtype == null) { throw new ArgumentNullException(nameof(dtype)); } if (member == null) { throw new ArgumentNullException(nameof(member)); } DataType = dtype; Member = member; ValueToCompare = valueToCompare; foreach (DataMember pk in dtype.PrimaryKey) { ValueCompareFilter pkFilter = new ValueCompareFilter(); pkFilter.Member = pk; pkFilter.ValueToCompare = (IComparable) pk.Member.GetValue(ValueToCompare); base.InnerFilters.Add(pkFilter); } }
/// <summary> /// Constructs the filter /// <para xml:lang="es"> /// Construye el filtro /// </para> /// </summary> /// <param name="dataValue"> /// DataValue used to link the local with the foreign DataObject /// <para xml:lang="es"> /// Valor de datos utilizado para vincular el local con el DataObject externo /// </para> /// </param> /// <param name="valueToCompare"> /// Foreign DataObject /// <para xml:lang="es"> /// DataObject foraneo /// </para> /// </param> public ForeignKeyFilter(DataType dtype, System.Reflection.MemberInfo member, object valueToCompare) { if (dtype == null) { throw new ArgumentNullException(nameof(dtype)); } if (member == null) { throw new ArgumentNullException(nameof(member)); } DataType = dtype; Member = member; ValueToCompare = valueToCompare; DataType foreignKeyType = Data.Validation.MemberExpression.GetReturnType(member); foreach (DataMember pk in foreignKeyType.PrimaryKey) { ValueCompareFilter pkFilter = new ValueCompareFilter(); pkFilter.Member = dtype[member.Name + "." + pk.Expression]; pkFilter.ValueToCompare = (IComparable) pk.Expression.GetValue(ValueToCompare); Container.InnerFilters.Add(pkFilter); } }
/// <summary> /// Constructs the filter /// </summary> /// <param name="dataValue"> /// DataValue used to link the local with the foreign DataObject /// </param> /// <param name="valueToCompare"> /// Foreign DataObject /// </param> public ForeignKeyFilter(DataType dtype, System.Reflection.MemberInfo member, object valueToCompare) { if (dtype == null) { throw new ArgumentNullException(nameof(dtype)); } if (member == null) { throw new ArgumentNullException(nameof(member)); } DataType = dtype; Member = member; ValueToCompare = valueToCompare; foreach (DataMember pk in dtype.PrimaryKey) { ValueCompareFilter pkFilter = new ValueCompareFilter(); pkFilter.Member = pk; pkFilter.ValueToCompare = (IComparable)pk.Member.GetValue(ValueToCompare); base.InnerFilters.Add(pkFilter); } }
/// <summary> /// Copies all values entered by the user to a DavaValueInstance collection /// </summary> /// <param name="members">Collection where values will be copied to</param> public Filter GetFilter(MemberInfo member) { //validate arguments if (member == null) throw new ArgumentNullException(nameof(member)); //filters Filter filter = null; DataType dtype = member.DeclaringType; Type returnType = MemberExpression.GetReturnType(member); //is this a single value member? (not a foreign key?) if (dtype.IsMapped(member.Name)) { DataMember dmember = dtype[member.Name]; #region Range filter //if it's a datetime or a numeric field, create range filter if (returnType.Equals(typeof(DateTime)) || returnType.IsNumeric()) { //realted fields FormField fieldMin = null, fieldMax = null; //search corresponding field for this DataValueInstance foreach (FormField f in Fields) { if (f.Name == member.Name + "_0") fieldMin = f; if (f.Name == member.Name + "_1") fieldMax = f; } //if no controls where found, return no filter if (fieldMin == null && fieldMax == null) { return null; } //if no value was set, return no filter if (!RequiredValidator.HasValue(fieldMin.Value) && !RequiredValidator.HasValue(fieldMax.Value)) { return null; } //if both values are set, create range filter if (RequiredValidator.HasValue(fieldMin.Value) && RequiredValidator.HasValue(fieldMax.Value)) { filter = new RangeFilter(dmember, (IComparable) fieldMin.Value, (IComparable) fieldMax.Value); } //only min value is defined else if (RequiredValidator.HasValue(fieldMin.Value)) { filter = new ValueCompareFilter(dmember, (IComparable) fieldMin.Value, CompareOperator.GreaterThanEqual); } //only max value is defined else if (RequiredValidator.HasValue(fieldMax.Value)) { filter = new ValueCompareFilter(dmember, (IComparable) fieldMax.Value, CompareOperator.LessThanEqual); } } #endregion #region Single value filter //create single value filter else { //realted fields FormField field = Fields.Where(f => f.Name == member.Name).SingleOrDefault(); //if field not found, return no filter if (field == null) { return null; } //if no value was set, return no filter if (!RequiredValidator.HasValue(field.Value)) { return null; } //if its a string, make a LIKE filter else if (field.ValueType.Equals(typeof(string))) { filter = new LikeFilter(dmember, "%" + field.Value + "%"); } //otherwise create a compare filter else { filter = new ValueCompareFilter(dmember, (IComparable) field.Value, CompareOperator.Equal); } } #endregion } //this is a foreign key else if (DataType.IsMapped(returnType) && dtype.IsForeignKey(member)) { //realted fields FormField field = Fields.Where(f => f.Name == member.Name).SingleOrDefault(); //if field not found, return no filter if (field == null) { return null; } //if no value was set, return no filter if (!RequiredValidator.HasValue(field.Value)) { return null; } filter = new ForeignKeyFilter(dtype, member, field.Value); } return filter; }