protected internal override YqlCompiledNode CompileNode(YqlCompiler compiler) { if (List == null) { throw new ArgumentNullException("List"); } if (ItemToFind == null) { throw new ArgumentNullException("ItemToFind"); } var compiledList = List.CompileNode(compiler); var listType = compiledList.Expression.Type; YqlCompiledNode compiledItemToFind = null; Expression expression = null; if (listType.IsArray) { Type itemType = compiledList.Expression.Type.GetElementType(); compiledItemToFind = compiler.CoerceTo( ItemToFind.CompileNode(compiler), itemType ); expression = Expression.Call( Info_ContainsCallback.MakeGenericMethod(itemType), compiledList.Expression, compiledItemToFind.Expression ); } else if (listType == typeof(YamsterUserSet)) { compiledItemToFind = compiler.CoerceTo( ItemToFind.CompileNode(compiler), typeof(long) ); // list.FindUserById(itemToFind) != null expression = Expression.NotEqual( Expression.Call( compiledList.Expression, YamsterUserSet.Info_FindUserById, compiledItemToFind.Expression ), Expression.Constant(null) ); } else { ReportError("The expression type " + listType.Name + " is not a list"); } return(new YqlCompiledNode(this, expression, new[] { compiledList, compiledItemToFind })); }
internal static Func <YqlExecutionContext, bool> Compile(YamsterModelQuery query) { var compiler = new YqlCompiler(query); var compiledQuery = compiler.CoerceTo(compiler.CompileNode(query.FilterNode), typeof(bool), "Expecting a boolean expression"); var filterExpression = Expression.Lambda <Func <YqlExecutionContext, bool> >( compiledQuery.Expression, compiler.ExecutionContextParameter); var compiledFunc = filterExpression.Compile(); return(compiledFunc); }