Wie erweitern Sie Linq to SQL?
-
09-06-2019 - |
Frage
Im vergangenen Jahr Scott Guthrie angegeben „Sie können die rohen SQL tatsächlich außer Kraft setzen, die LINQ to SQL verwendet, wenn Sie absolute Kontrolle über die ausgeführten SQL wollen“, aber ich kann eine Dehnbarkeit Methode nicht Dokumentation beschreibt.
Ich mag die folgende LINQ to SQL-Abfrage ändern:
using (NorthwindContext northwind = new NorthwindContext ()) { var q = from row in northwind.Customers let orderCount = row.Orders.Count () select new { row.ContactName, orderCount }; }
Was ergibt sich folgende TSQL:
SELECT [t0].[ContactName], ( SELECT COUNT(*) FROM [dbo].[Orders] AS [t1] WHERE [t1].[CustomerID] = [t0].[CustomerID] ) AS [orderCount] FROM [dbo].[Customers] AS [t0]
An:
using (NorthwindContext northwind = new NorthwindContext ()) { var q = from row in northwind.Customers.With ( TableHint.NoLock, TableHint.Index (0)) let orderCount = row.Orders.With ( TableHint.HoldLock).Count () select new { row.ContactName, orderCount }; }
Welche würde Ergebnis in der folgenden TSQL:
SELECT [t0].[ContactName], ( SELECT COUNT(*) FROM [dbo].[Orders] AS [t1] WITH (HOLDLOCK) WHERE [t1].[CustomerID] = [t0].[CustomerID] ) AS [orderCount] FROM [dbo].[Customers] AS [t0] WITH (NOLOCK, INDEX(0))
Mit:
public static Table<TEntity> With<TEntity> ( this Table<TEntity> table, params TableHint[] args) where TEntity : class { //TODO: implement return table; } public static EntitySet<TEntity> With<TEntity> ( this EntitySet<TEntity> entitySet, params TableHint[] args) where TEntity : class { //TODO: implement return entitySet; }
Und
public class TableHint { //TODO: implement public static TableHint NoLock; public static TableHint HoldLock; public static TableHint Index (int id) { return null; } public static TableHint Index (string name) { return null; } }
irgendeine Art von LINQ to SQL Erweiterbarkeit verwenden, außer dieses . Irgendwelche Ideen?
Lösung
Die Fähigkeit, die zugrunde liegenden Anbieter zu ändern und damit die SQL ändert nicht den letzten Schnitt in LINQ to SQL machen.
Andere Tipps
Matt Warren Blog hat alles, was Sie dazu brauchen:
Sie möchten einen Ausdrucksbaum in SQL übersetzen ... Sie müssen Ihre eigenen IQueryProvider
implementierenDatacontext x = new Datacontext;
// So etwas wie dies vielleicht?
var a = x.Where (). Mit () ... etc
Lassen Sie uns Ihnen eine viel feinere Kontrolle über die SQL haben.