質問

昨年、スコット・ガスリー 述べました 「実行される 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 の最終段階には達しませんでした。

他のヒント

Matt Warren のブログには、そのために必要なものがすべて揃っています。

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

式ツリーを SQL に変換したいと考えています...独自の IQueryProvider を実装する必要があります

IQueryProvider リファレンス
方法

MSDN の使い方

DataContext x = 新しい DataContext;

//おそらくこんな感じでしょうか?

var a = x.Where().with()...など

SQL をより細かく制御できるようになります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top