Пример #1
0
        public void Translate(MethodCallExpression method, ITranslationResult result)
        {
            if (method.Method.Name != MethodName || method.Arguments.Count != 2)
            {
                var message = string.Format(Resources.TranslatorMethodNotSupported, method.Method.Name);
                throw new ArgumentOutOfRangeException("method", message);
            }

            var lambda = (LambdaExpression)ExpressionTranslator.StripQuotes(method.Arguments[1]);

            // ReSharper disable ForCanBeConvertedToForeach

            if (lambda.Body.NodeType == ExpressionType.MemberInit)
            {
                var memberInit = (MemberInitExpression)lambda.Body;

                for (int i = 0; i < memberInit.Bindings.Count; i++)
                {
                    MemberBinding binding = memberInit.Bindings[i];
                    AddColumn(binding.Member.Name, result);
                }
            }
            else if (lambda.Body.NodeType == ExpressionType.New)
            {
                var newInstance = (NewExpression)lambda.Body;

                for (int i = 0; i < newInstance.Arguments.Count; i++)
                {
                    Expression argument = newInstance.Arguments[i];
                    var        member   = (MemberExpression)argument;
                    AddColumn(member.Member.Name, result);
                }
            }
            else
            {
                throw new NotSupportedException(string.Format(Resources.TranslatorMemberNotSupported, lambda.Body.NodeType));
            }

            // ReSharper restore ForCanBeConvertedToForeach

            AddPostProcessing(method, result);
        }