public override bool IsValid(object value) { // Construct the data context //ConstructorInfo constructor = DataContextType.GetConstructor(new Type[0]); //DataContext dataContext = (DataContext)constructor.Invoke(new object[0]); var repository = DependencyResolver.Current.GetService(DataContextType); var data = repository.GetType().InvokeMember("GetAll", BindingFlags.Instance | BindingFlags.InvokeMethod | BindingFlags.Public, null, repository, null); // Get the table //ITable table = dataContext.GetTable(EntityType); // Get the property PropertyInfo propertyInfo = EntityType.GetProperty(PropertyName); // Our ultimate goal is an expression of: // "entity => entity.PropertyName == value" // Expression: "value" object convertedValue = Convert.ChangeType(value, propertyInfo.PropertyType); var rhs = Expression.Constant(convertedValue); // Expression: "entity" var parameter = Expression.Parameter(EntityType, "entity"); // Expression: "entity.PropertyName" var property = Expression.MakeMemberAccess(parameter, propertyInfo); // Expression: "entity.PropertyName == value" var equal = Expression.Equal(property, rhs); // Expression: "entity => entity.PropertyName == value" var lambda = Expression.Lambda(equal, parameter).Compile(); // Instantiate the count method with the right TSource (our entity type) MethodInfo countMethod = QueryableCountMethod.MakeGenericMethod(EntityType); // Execute Count() and say "you're valid if you have none matching" int count = (int)countMethod.Invoke(null, new object[] { data, lambda }); return(count == 0); }
public override bool IsValid(object value) { string str = (string)value; if (String.IsNullOrWhiteSpace(str)) { return(true); } // Cleanup the string str = str.Trim(); // Construct the data context ConstructorInfo constructor = DataContextType.GetConstructor(new Type[0]); DataContext dataContext = (DataContext)constructor.Invoke(new object[0]); // Get the table ITable table = dataContext.GetTable(EntityType); // Get the property PropertyInfo propertyInfo = EntityType.GetProperty(PropertyName); // Expression: "entity" ParameterExpression parameter = Expression.Parameter(EntityType, "entity"); // Expression: "entity.PropertyName" MemberExpression property = Expression.MakeMemberAccess(parameter, propertyInfo); // Expression: "value" object convertedValue = Convert.ChangeType(value, propertyInfo.PropertyType); ConstantExpression rhs = Expression.Constant(convertedValue); // Expression: "entity.PropertyName == value" BinaryExpression equal = Expression.Equal(property, rhs); // Expression: "entity => entity.PropertyName == value" LambdaExpression lambda = Expression.Lambda(equal, parameter); // Instantiate the count method with the right TSource (our entity type) MethodInfo countMethod = QueryableCountMethod.MakeGenericMethod(EntityType); // Execute Count() and say "you're valid if you have none matching" int count = (int)countMethod.Invoke(null, new object[] { table, lambda }); return(count == 0); }