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 }));
        }
Exemple #2
0
        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);
        }