Mi van, ha egy LINQ kifejezésben olyan szűrést szeretnénk végrehajtani, amit a LINQ2SQL réteg nem tud okosan végrehajtani, mert pl. TSQL függvényt kellene használnunk a where feltételben?
Ha nem ügyeskedünk, átjön a 100 millió sor az adatelérő rétegbe, aztán szűr a LINQ maga. Szép is lenne.
No, az okosság az ilyen esetekre az, hogy lehet használni TSQL függvényeket a LINQ where feltételben. Ettől még nem lesz index seek, de legalább a szerver szűr.
A linkelt példát kipróbáltam, tényleg a szerver szűr.
AdwentureWorks-szel:
AWDataContext dc = new AWDataContext(); dc.Log = Console.Out; var q = from o in dc.PurchaseOrderHeaders where dc.WeekOfYear(o.OrderDate) == 23 select o; foreach (var item in q) { Console.WriteLine(item.OrderDate); }
ALTER FUNCTION WeekOfYear(@Date DateTime) RETURNS Int AS BEGIN RETURN (CAST(DATEPART(ww, @Date) AS INT)) END
Az SQL, ami bemegy a szerverhez:
SELECT [t0].[PurchaseOrderID], [t0].[RevisionNumber], [t0].[Status], [t0].[EmployeeID], [t0].[VendorID], [t0].[ShipMethodID], [t0].[OrderDate], [t0].[ShipDate], [t0].[SubTotal], [t0].[TaxAmt], [t0].[Freight], [t0].[TotalDue], [t0].[ModifiedDate] FROM [Purchasing].[PurchaseOrderHeader] AS [t0] WHERE [dbo].[WeekOfYear]([t0].[OrderDate]) = @p0 -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [23] -- Context: SqlProvider(Sql2005) Model: AttributedMetaModel Build: 3.5.21022.8
Could you hire me? Contact me if you like what I’ve done in this article and think I can create value for your company with my skills.