public void ArrayContainsWithNullGuard() { try { CustomFilterCompilers.RegisterBinaryExpressionCompiler(info => { if (info.DataItemExpression.Type == typeof(Post) && info.AccessorText == "Tags" && info.Operation == "contains") { var text = Convert.ToString(info.Value); var tagsAccessor = Expression.Property(info.DataItemExpression, "Tags"); var containsCall = Expression.Call( typeof(Enumerable), nameof(Enumerable.Contains), new[] { typeof(string) }, tagsAccessor, Expression.Constant(text) /*, Expression.Constant(StringComparer.InvariantCultureIgnoreCase)*/ ); return(Expression.Condition( Expression.MakeBinary(ExpressionType.NotEqual, tagsAccessor, Expression.Constant(null, typeof(string[]))), containsCall, Expression.Constant(false) )); } return(null); }); var source = new[] { new Post { Tags = new[] { "news", "article" } }, new Post { Tags = new[] { "announcement" } } }; var loadOptions = new SampleLoadOptions { Filter = new[] { "Tags", "contains", "news" }, RequireTotalCount = true }; var loadResult = DataSourceLoader.Load(source, loadOptions); Assert.Equal(1, loadResult.totalCount); Assert.Contains(loadOptions.ExpressionLog, line => line.Contains(@".Where(obj => IIF((obj.Tags != null), obj.Tags.Contains(""news""), False))")); } finally { CustomFilterCompilers.Binary.CompilerFuncs.Clear(); } }
public void OneToManyContains() { // https://github.com/DevExpress/DevExtreme.AspNet.Data/issues/277#issuecomment-497249871 try { CustomFilterCompilers.RegisterBinaryExpressionCompiler(info => { if (info.DataItemExpression.Type == typeof(Category) && info.AccessorText == "Products" && info.Operation == "contains") { var text = Convert.ToString(info.Value); Expression <Func <Product, bool> > innerLambda = (p) => p.Name.ToLower().Contains(text); return(Expression.Call( typeof(Enumerable), nameof(Enumerable.Any), new[] { typeof(Product) }, Expression.Property(info.DataItemExpression, "Products"), innerLambda )); } return(null); }); var source = new[] { new Category(), new Category() }; source[0].Products.Add(new Product { Name = "Chai" }); var filter = JsonConvert.DeserializeObject <IList>(@"[ ""Products"", ""Contains"", ""ch"" ]"); var loadOptions = new SampleLoadOptions { Filter = filter, RequireTotalCount = true }; var loadResult = DataSourceLoader.Load(source, loadOptions); Assert.Equal(1, loadResult.totalCount); Assert.Contains(loadOptions.ExpressionLog, line => line.Contains(".Products.Any(p => p.Name.ToLower().Contains(")); } finally { CustomFilterCompilers.Binary.CompilerFuncs.Clear(); } }
public void StringToLower() { try { var stringToLowerLog = new List <bool>(); CustomFilterCompilers.RegisterBinaryExpressionCompiler(info => { stringToLowerLog.Add(info.StringToLower); return(Expression.Constant(true)); }); foreach (var stringToLower in new[] { false, true }) { DataSourceLoader.Load(new Product[0], new SampleLoadOptions { Filter = new[] { "any", "any", "any" }, StringToLower = stringToLower }); } Assert.False(stringToLowerLog[0]); Assert.True(stringToLowerLog[1]); } finally { CustomFilterCompilers.Binary.CompilerFuncs.Clear(); } }