transact - ¿Cómo extiendes Linq a SQL?
linq to sql vs entity framework (4)
El año pasado, Scott Guthrie afirmó: "En realidad, puede anular el SQL sin procesar que utiliza LINQ to SQL si desea un control absoluto sobre el SQL ejecutado", pero no puedo encontrar la documentación que describa un método de extensibilidad.
Me gustaría modificar la siguiente consulta de LINQ a SQL:
using (NorthwindContext northwind = new NorthwindContext ()) { var q = from row in northwind.Customers let orderCount = row.Orders.Count () select new { row.ContactName, orderCount }; }
Lo que da como resultado el siguiente TSQL:
SELECT [t0].[ContactName], ( SELECT COUNT(*) FROM [dbo].[Orders] AS [t1] WHERE [t1].[CustomerID] = [t0].[CustomerID] ) AS [orderCount] FROM [dbo].[Customers] AS [t0]
A:
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 }; }
Lo que daría como resultado el siguiente 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))
Utilizando:
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; }
Y
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; } }
Usando algún tipo de extensibilidad de LINQ a SQL, que no sea este . ¿Algunas ideas?
DataContext x = new DataContext;
// ¿Algo como esto quizás?
var a = x.Where (). with () ... etc
vamos a tener un control mucho más fino sobre el sql.
Desea traducir un árbol de expresiones en SQL ... Debe implementar su propio IQueryProvider
El blog de Matt Warren tiene todo lo que necesitas para eso:
La capacidad de cambiar el proveedor subyacente y así modificar el SQL no hizo el corte final en LINQ to SQL.