Вопрос

В прошлом году Скотт Гатри заявленный “На самом деле вы можете переопределить необработанный 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.

Другие советы

В блоге Мэтта Уоррена есть все, что вам для этого нужно:

http://blogs.msdn.com/mattwar/

Вы хотите перевести дерево выражений в SQL...Вам нужно реализовать свой собственный IQueryProvider

Ссылка на IQueryProvider
Как сделать

MSDN Как

DataContext x = новый DataContext;

// Возможно, что-то вроде этого?

var a = x.Where().with() ... и т. д

давайте обеспечим вам гораздо более точный контроль над sql.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top