LINQ在生成的SQL中为我的int添加了神秘的"+1"

Ref*_*din 0 .net c# sql linq linq-to-sql

我不得不承认,我只是计划难过......我有以下LINQ to SQL方法 - >

    public static int GetLastInvoiceNumber(int empNumber)
    {
        using (var context = CmoDataContext.Create())
        {
            context.Log = Console.Out;

            IQueryable<tblGreenSheet> tGreenSheet = context.GetTable<tblGreenSheet>();
            return (tGreenSheet
                            .Where(gs => gs.InvoiceNumber.Substring(3, 4) == empNumber.ToString())
                            .Max(gs => Convert.ToInt32(gs.InvoiceNumber.Substring(7, gs.InvoiceNumber.Length)))
                            );
        }
    }
Run Code Online (Sandbox Code Playgroud)

这是基于同事编写的SQL查询来实现的,它实现了几乎相同的东西 - >

SELECT DISTINCT 
SUBSTRING([InvoiceNumber], 1, 6) AS EmpNumber,
MAX(CAST(SUBSTRING([InvoiceNumber], 7, LEN([InvoiceNumber])) AS INT)) AS MaxInc
FROM [CMO].[dbo].[tblGreenSheet]
WHERE SUBSTRING([InvoiceNumber], 3, 4) = '1119' --EmployeeNumber
GROUP BY SUBSTRING([InvoiceNumber], 1, 6)
Run Code Online (Sandbox Code Playgroud)

但是,当我检查时生成的SQL context.Log = Console.Out是 - >

SELECT MAX([t1].[value]) AS [value]
FROM (
    SELECT CONVERT(Int,SUBSTRING([t0].[InvoiceNumber], @p0 + 1, LEN([t0].[InvoiceNumber]))) AS [value], [t0].[InvoiceNumber]
    FROM [dbo].[tblGreenSheet] AS [t0]
    ) AS [t1]
WHERE SUBSTRING([t1].[InvoiceNumber], @p1 + 1, @p2) = @p3
-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [7]
-- @p1: Input Int (Size = 0; Prec = 0; Scale = 0) [3]
-- @p2: Input Int (Size = 0; Prec = 0; Scale = 0) [4]
-- @p3: Input VarChar (Size = 4; Prec = 0; Scale = 0) [1119]
Run Code Online (Sandbox Code Playgroud)

你可以看到它实际上与一些添加的GLARING异常相当接近+1!

WTH?!?

我甚至通过删除+1生成的SQL中的's并运行它来生成与原始SQL相同的结果来验证它是正确的.

那么,我错过了什么或做错了什么?这是一个众所周知的LINQ LOL与我们不那么有才华的程序员搞砸了吗?

Mar*_*tos 5

SQL Server的SUBSTRING使用基于1的索引,而string.Substring使用从零开始的索引.该+ 1碱基之间的映射保留C#语义.

至于为什么你必须删除它+ 1以使其正常工作,这对我来说是一个谜.