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与我们不那么有才华的程序员搞砸了吗?
SQL Server的SUBSTRING使用基于1的索引,而string.Substring使用从零开始的索引.该+ 1碱基之间的映射保留C#语义.
至于为什么你必须删除它+ 1以使其正常工作,这对我来说是一个谜.
| 归档时间: |
|
| 查看次数: |
224 次 |
| 最近记录: |