Как вы расширяете Linq до SQL?
-
09-06-2019 - |
Вопрос
В прошлом году Скотт Гатри заявленный “На самом деле вы можете переопределить необработанный SQL, который использует LINQ to SQL, если хотите получить абсолютный контроль над выполняемым SQL”, но я не могу найти документацию, описывающую метод расширения.
Я хотел бы изменить следующий запрос LINQ to SQL:
using (NorthwindContext northwind = new NorthwindContext ()) { var q = from row in northwind.Customers let orderCount = row.Orders.Count () select new { row.ContactName, orderCount }; }
Что приводит к следующему TSQL:
SELECT [t0].[ContactName], ( SELECT COUNT(*) FROM [dbo].[Orders] AS [t1] WHERE [t1].[CustomerID] = [t0].[CustomerID] ) AS [orderCount] FROM [dbo].[Customers] AS [t0]
Для:
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 }; }
Который бы в результате получается следующий 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))
Используя:
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; }
И
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; } }
Использование какого-либо типа расширяемости LINQ to SQL, отличного от этот.Есть какие-нибудь идеи?
Решение
Возможность сменить базового поставщика и, таким образом, модифицировать SQL не внесла окончательного изменения в LINQ to SQL.
Другие советы
В блоге Мэтта Уоррена есть все, что вам для этого нужно:
Вы хотите перевести дерево выражений в SQL...Вам нужно реализовать свой собственный IQueryProvider
DataContext x = новый DataContext;
// Возможно, что-то вроде этого?
var a = x.Where().with() ... и т. д
давайте обеспечим вам гораздо более точный контроль над sql.