/// <summary>
        /// Creates the function mappings for this DQE.
        /// </summary>
        private static void CreateFunctionMappingStore()
        {
            // Parameter 0 is the element the method is called on. parameter 1 is the first argument etc.
            // All indexes are converted to 0-based.
            ////////////////////////////////////////////////
            // VB.NET compiler services specific methods
            ////////////////////////////////////////////////
            // CompareString(3), which is emitted by the VB.NET compiler when a '=' operator is used between two string-typed operands.
            _functionMappings.Add(new FunctionMapping("Microsoft.VisualBasic.CompilerServices.Operators", "CompareString", 3, "CASE WHEN {0} < {1} THEN -1 WHEN {0} = {1} THEN 0 ELSE 1 END"));

            ////////////////////////////////////////////////
            // Array related properties
            ////////////////////////////////////////////////
            // Length
            _functionMappings.Add(new FunctionMapping(typeof(Array), "get_Length", 0, "LENGTH({0})"));

            ////////////////////////////////////////////////
            // Boolean related functions
            ////////////////////////////////////////////////
            // Negate(1) (!operand)
            _functionMappings.Add(new FunctionMapping(typeof(bool), "Negate", 1, "NOT ({0}=1)"));
            // ToString()
            _functionMappings.Add(new FunctionMapping(typeof(bool), "ToString", 0, "CASE WHEN ({0})=1 THEN 'True' ELSE 'False' END"));


            ////////////////////////////////////////////////
            // Char related functions
            ////////////////////////////////////////////////
            // ToUnicode(1) (new method, used to convert char to unicode.
            _functionMappings.Add(new FunctionMapping(typeof(char), "ToUnicode", 1, "UNICODE({0})"));

            ////////////////////////////////////////////////
            // Convert related functions
            ////////////////////////////////////////////////
            // ToBoolean(1)
            _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToBoolean", 1, "(CONVERT(BIT, {0})=1)"));
            // ToByte(1)
            _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToByte", 1, "CONVERT(TINYINT, {0})"));
            // ToChar(1)
            _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToChar", 1, "CONVERT(NCHAR, {0})"));
            // ToDateTime(1)
            _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToDateTime", 1, "CONVERT(DATETIME, {0})"));
            // ToDecimal(1)
            _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToDecimal", 1, "CONVERT(DECIMAL, {0})"));
            // ToDouble(1)
            _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToDouble", 1, "CONVERT(FLOAT, {0})"));
            // ToInt16(1)
            _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToInt16", 1, "CONVERT(SMALLINT, {0})"));
            // ToInt32(1)
            _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToInt32", 1, "CONVERT(INT, {0})"));
            // ToInt64(1)
            _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToInt64", 1, "CONVERT(BIGINT, {0})"));
            // ToSingle(1)
            _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToSingle", 1, "CONVERT(REAL, {0})"));
            // ToString(1)
            _functionMappings.Add(new FunctionMapping(typeof(Convert), "ToString", 1, "CONVERT(NVARCHAR(4000), {0})"));

            ////////////////////////////////////////////////
            // byte related functions
            ////////////////////////////////////////////////
            _functionMappings.Add(new FunctionMapping(typeof(byte), "ToString", 0, "CONVERT(NVARCHAR(4), {0})"));
            _functionMappings.Add(new FunctionMapping(typeof(sbyte), "ToString", 0, "CONVERT(NVARCHAR(4), {0})"));

            ////////////////////////////////////////////////
            // Int16 related functions
            ////////////////////////////////////////////////
            _functionMappings.Add(new FunctionMapping(typeof(Int16), "ToString", 0, "CONVERT(NVARCHAR(5), {0})"));
            _functionMappings.Add(new FunctionMapping(typeof(UInt16), "ToString", 0, "CONVERT(NVARCHAR(5), {0})"));

            ////////////////////////////////////////////////
            // Int32 related functions
            ////////////////////////////////////////////////
            _functionMappings.Add(new FunctionMapping(typeof(Int32), "ToString", 0, "CONVERT(NVARCHAR(10), {0})"));
            _functionMappings.Add(new FunctionMapping(typeof(UInt32), "ToString", 0, "CONVERT(NVARCHAR(10), {0})"));

            ////////////////////////////////////////////////
            // Int64 related functions
            ////////////////////////////////////////////////
            _functionMappings.Add(new FunctionMapping(typeof(Int64), "ToString", 0, "CONVERT(NVARCHAR(32), {0})"));
            _functionMappings.Add(new FunctionMapping(typeof(UInt64), "ToString", 0, "CONVERT(NVARCHAR(32), {0})"));

            ////////////////////////////////////////////////
            // DateTime related functions
            ////////////////////////////////////////////////
            // AddDays(1)
            _functionMappings.Add(new FunctionMapping(typeof(DateTime), "AddDays", 1, "DATEADD(day, {1}, {0})"));
            // AddHours(1)
            _functionMappings.Add(new FunctionMapping(typeof(DateTime), "AddHours", 1, "DATEADD(hour, {1}, {0})"));
            // AddMilliseconds(1)
            _functionMappings.Add(new FunctionMapping(typeof(DateTime), "AddMilliseconds", 1, "DATEADD(millisecond, {1}, {0})"));
            // AddMinutes(1)
            _functionMappings.Add(new FunctionMapping(typeof(DateTime), "AddMinutes", 1, "DATEADD(minute, {1}, {0})"));
            // AddMonths(1)
            _functionMappings.Add(new FunctionMapping(typeof(DateTime), "AddMonths", 1, "DATEADD(month, {1}, {0})"));
            // AddSeconds(1)
            _functionMappings.Add(new FunctionMapping(typeof(DateTime), "AddSeconds", 1, "DATEADD(second, {1}, {0})"));
            // AddYears(1)
            _functionMappings.Add(new FunctionMapping(typeof(DateTime), "AddYears", 1, "DATEADD(year, {1}, {0})"));
            // Compare(2)
            _functionMappings.Add(new FunctionMapping(typeof(DateTime), "Compare", 2, "CASE WHEN {0} < {1} THEN -1 WHEN {0} = {1} THEN 0 ELSE 1 END"));
            ////////////////////////////////////////////////
            // DateTime related properties
            ////////////////////////////////////////////////
            // Date
            _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_Date", 0, "DATE({0})"));
            // Day
            _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_Day", 0, "DAY({0})"));
            // DayOfWeek
            _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_DayOfWeek", 0, "(DOW({0}) + (SELECT CONNECTION_PROPERTY('first_day_of_week')) + 6) % 7"));
            // DayOfYear
            _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_DayOfYear", 0, "DATEPART(dy, {0})"));
            // Hour
            _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_Hour", 0, "DATEPART(hh, {0})"));
            // Millisecond
            _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_Millisecond", 0, "DATEPART(ms, {0})"));
            // Minute
            _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_Minute", 0, "DATEPART(mi, {0})"));
            // Month
            _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_Month", 0, "MONTH({0})"));
            // Second
            _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_Second", 0, "DATEPART(ss, {0})"));
            // Year
            _functionMappings.Add(new FunctionMapping(typeof(DateTime), "get_Year", 0, "YEAR({0})"));

            ////////////////////////////////////////////////
            // Decimal related functions
            ////////////////////////////////////////////////
            // Add(2)
            _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Add", 2, "({0} + {1})"));
            // Ceiling(1)
            _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Ceiling", 1, "CEILING({0})"));
            // Compare(2)
            _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Compare", 2, "CASE WHEN {0} < {1} THEN -1 WHEN {0} = {1} THEN 0 ELSE 1 END"));
            // Divide(2)
            _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Divide", 2, "({0} / {1})"));
            // Floor(1)
            _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Floor", 1, "FLOOR({0})"));
            // Multiply(2)
            _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Multiply", 2, "({0} * {1})"));
            // Negate(1)
            _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Negate", 1, "(-1 * {0})"));
            // Remainder(2)
            _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Remainder", 2, "({0} - (CAST(({0} / {1}) AS INT) * {1}))"));
            // Round(1)
            _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Round", 1, "ROUND({0}, 0)"));
            // Round(2)
            _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Round", 2, "ROUND({0}, {1})"));
            // Substract(2)
            _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Subtract", 2, "({0} - {1})"));
            // Truncate(1)
            _functionMappings.Add(new FunctionMapping(typeof(Decimal), "Truncate", 1, "TRUNCNUM({0}, 0)"));

            ////////////////////////////////////////////////
            // Math related functions
            ////////////////////////////////////////////////
            // Pow
            _functionMappings.Add(new FunctionMapping(typeof(Math), "Pow", 2, "POWER({0}, {1})"));

            ////////////////////////////////////////////////
            // String related functions
            ////////////////////////////////////////////////
            // Compare(2)
            _functionMappings.Add(new FunctionMapping(typeof(string), "Compare", 2, "CASE WHEN {0} < {1} THEN -1 WHEN {0} = {1} THEN 0 ELSE 1 END"));
            // Concat(2).
            _functionMappings.Add(new FunctionMapping(typeof(string), "Concat", 2, "({0} + {1})"));
            // IndexOf(1).
            _functionMappings.Add(new FunctionMapping(typeof(string), "IndexOf", 1, "(CHARINDEX({1}, {0}) - 1)"));
            // IndexOf(2)
            _functionMappings.Add(new FunctionMapping(typeof(string), "IndexOf", 2, "(CHARINDEX({1}, {0}, {2} + 1) - 1)"));
            // LastIndexOf(1)
            _functionMappings.Add(new FunctionMapping(typeof(string), "LastIndexOf", 1, "CASE WHEN COALESCE(CHARINDEX({1}, {0}), 0)=0 THEN -1 ELSE (LENGTH({0}) - CHARINDEX(REVERSE({1}), REVERSE({0})))-(LENGTH({1})-1) END"));
            // LastIndexOf(2)
            _functionMappings.Add(new FunctionMapping(typeof(string), "LastIndexOf", 2, "CASE WHEN LENGTH({0})<= {2} THEN -1 WHEN COALESCE(CHARINDEX({1}, LEFT({0}, {2})), 0)=0 THEN -1 ELSE ({2} - CHARINDEX(REVERSE({1}), REVERSE(LEFT({0}, {2}))))-(LENGTH({1})-1) END"));
            // PadLeft(1)
            _functionMappings.Add(new FunctionMapping(typeof(string), "PadLeft", 1, "CASE WHEN LENGTH({0})>={1} THEN {0} ELSE SPACE({1} - LENGTH({0})) + {0} END"));
            // PadLeft(2)
            _functionMappings.Add(new FunctionMapping(typeof(string), "PadLeft", 2, "CASE WHEN LENGTH({0})>={1} THEN {0} ELSE REPLICATE({2}, {1} - LENGTH({0})) + {0} END"));
            // PadRight(1)
            _functionMappings.Add(new FunctionMapping(typeof(string), "PadRight", 1, "CASE WHEN LENGTH({0})>={1} THEN {0} ELSE {0} + SPACE({1} - LENGTH({0})) END"));
            // PadRight(2)
            _functionMappings.Add(new FunctionMapping(typeof(string), "PadRight", 2, "CASE WHEN LENGTH({0})>={1} THEN {0} ELSE {0} + REPLICATE({2}, {1} - LENGTH({0})) END"));
            // Remove(1)
            _functionMappings.Add(new FunctionMapping(typeof(string), "Remove", 1, "LEFT({0}, {1})"));
            // Remove(2)
            _functionMappings.Add(new FunctionMapping(typeof(string), "Remove", 2, "STUFF({0}, {1}+1, {2}, '')"));
            // Replace(2)
            _functionMappings.Add(new FunctionMapping(typeof(string), "Replace", 2, "REPLACE({0}, {1}, {2})"));
            // Substring(1)
            _functionMappings.Add(new FunctionMapping(typeof(string), "Substring", 1, "SUBSTRING({0}, {1}+1)"));
            // Substring(2)
            _functionMappings.Add(new FunctionMapping(typeof(string), "Substring", 2, "SUBSTRING({0}, {1}+1, {2})"));
            // ToLower(0)
            _functionMappings.Add(new FunctionMapping(typeof(string), "ToLower", 0, "LOWER({0})"));
            // ToUpper(0)
            _functionMappings.Add(new FunctionMapping(typeof(string), "ToUpper", 0, "UPPER({0})"));
            // Trim(0)
            _functionMappings.Add(new FunctionMapping(typeof(string), "Trim", 0, "TRIM({0})"));
            ////////////////////////////////////////////////
            // String related properties
            ////////////////////////////////////////////////
            // Length
            _functionMappings.Add(new FunctionMapping(typeof(string), "get_Length", 0, "LENGTH({0})"));
            // Chars(1) / indexer
            _functionMappings.Add(new FunctionMapping(typeof(string), "get_Chars", 1, "SUBSTRING({0}, {1}+1, 1) "));

            ////////////////////////////////////////////////
            // Object related functions
            ////////////////////////////////////////////////
            // IIF(3). (IIF(op1, op2, op3) / op1 ? op2 : op3 statement)
            _functionMappings.Add(new FunctionMapping(typeof(object), "IIF", 3, "CASE WHEN {0}=1 THEN {1} ELSE {2} END"));
            // IIF(3). (IIF(op1, op2, op3) / op1 ? op2 : op3 statement). Used for boolean operands. The IIF will end up being wrapped with a boolean wrapper anyway, so it has to produce a boolean
            _functionMappings.Add(new FunctionMapping(typeof(object), "IIF_Bool", 3, "(CASE WHEN {0}=1 THEN {1} ELSE {2} END)=1"));
            // LeftShift(2). (op1 << op2)
            _functionMappings.Add(new FunctionMapping(typeof(object), "LeftShift", 2, "({0} * POWER(2, {1}))"));
            // RightShift(2). (op1 >> op2)
            _functionMappings.Add(new FunctionMapping(typeof(object), "RightShift", 2, "({0} / POWER(2, {1}))"));
            // BooleanInProjectionWrapper(1)
            _functionMappings.Add(new FunctionMapping(typeof(object), "BooleanInProjectionWrapper", 1, "CASE WHEN {0} THEN 1 ELSE 0 END"));
        }