Я должен признать, я просто поставил в тупик .... У меня есть метод 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)))
);
}
}
Это было сделано на основе запроса 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]
Вы можете видеть, что это на самом деле довольно близко, за исключением GLARING некоторых добавленных +1
's !!!
WTH?!?
Я даже проверил, что он будет верен, удалив +1
в сгенерированном SQL и запустив его с его генерацией.результаты как исходный SQL.
Итак, что я пропускаю или делаю неправильно?Это хорошо известно LOL о LINQ, чтобы связать нас с менее талантливыми программистами?