예제 #1
0
        private SortField CreateSortFieldFromExpr(MethodCallExpression node, bool reverse)
        {
            string name;

            var unaryExpr = node.Arguments[1] as UnaryExpression;

            if (unaryExpr == null)
            {
                throw new Exception("Invalid sort: " + node.ToString());
            }

            var operand = unaryExpr.Operand as LambdaExpression;

            if (operand == null)
            {
                throw new Exception("Invalid sort: " + node.ToString());
            }

            var memberExpr = operand.Body as MemberExpression;

            if (memberExpr != null)
            {
                name = memberExpr.Member.Name;
                return(LucQuery.CreateSortField(name, reverse));
            }

            var methodCallExpr = operand.Body as MethodCallExpression;

            if (methodCallExpr == null)
            {
                throw new Exception("Invalid sort: " + node.ToString());
            }

            if (methodCallExpr.Method.Name != "get_Item")
            {
                throw new Exception("Invalid sort: " + node.ToString());
            }

            if (methodCallExpr.Arguments.Count != 1)
            {
                throw new Exception("Invalid sort: " + node.ToString());
            }

            var nameExpr = methodCallExpr.Arguments[0] as ConstantExpression;

            if (nameExpr == null)
            {
                throw new Exception("Invalid sort: " + node.ToString());
            }

            name = (string)nameExpr.Value;
            return(LucQuery.CreateSortField(name, reverse));
        }