我不得不承認,我只是打算難倒加入神祕 「+1」 我INT的....我有下面的LINQ to SQL方法 - >LINQ中生成的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)))
);
}
}
這是從一個同事寫的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)
然而,正在生成的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]
你可以看到,它實際上是相當接近與明顯的例外的一些附加+1
的!
WTH?!?
我甚至證實,通過刪除生成的SQL中的+1
並運行它生成與原始SQL相同的結果,它將是正確的。
那麼,我錯過了什麼或做錯了什麼?這是衆所周知的LINQ的LOL與我們這些天賦不足的程序員混在一起嗎?
我看到...但LINQ版本根本不起作用。它嘗試返回NULL,因爲沒有任何匹配。但我知道有SQL版本的工作原理和LINQ/SQL轉儲工作沒有+ 1的 –
順便說一句,謝謝你解釋它,我只是希望我知道爲什麼它不工作,然後...... –