public void substring_of_column()
 {
     A.CallTo(() => _provider.Substring("Title", 0, 1)).Returns("sub(Title)");
     _l = d => d.Title.Substring(0, 1);
     Get(_l).Should().Be("sub(Title)");
     _sut.GetColumnsSql(_l).Should().Be("sub(Title)");
     _l = d => new { Name = d.Title.Substring(0, 1) };
     _sut.GetColumnsSql(_l).Should().Be("sub(Title) as Name");
 }
        private void HandleParamStringFunctions(MethodCallExpression node)
        {
            var name = GetColumnName(node.Object as MemberExpression);

            object firstArg = null;

            if (node.Arguments.HasItems())
            {
                firstArg = node.Arguments[0].GetValue();
            }
            string value = "";

            switch (node.Method.Name)
            {
            case "StartsWith":
                value = $"{name} like @{Parameters.CurrentIndex}";
                Parameters.AddValues(firstArg + "%");
                break;

            case "EndsWith":
                value = $"{name} like @{Parameters.CurrentIndex}";
                Parameters.AddValues("%" + firstArg);
                break;

            case "Contains":
                value = $"{name} like @{Parameters.CurrentIndex}";
                Parameters.AddValues("%" + firstArg + "%");
                break;

            case "ToUpper":
            case "ToUpperInvariant":
                value = _provider.ToUpper(name);
                break;

            case "ToLower":
            case "ToLowerInvariant":
                value = _provider.ToLower(name);
                break;

            case "Substring":
                value = _provider.Substring(name, (int)firstArg, (int)node.Arguments[1].GetValue());
                break;
            }

            _sb.Append(value);
        }