13

昨年、Scott Guthrieは、「実行されるSQLを完全に制御したい場合は、LINQ to SQLが使用する生のSQLを実際にオーバーライドできます」と述べましたが、拡張性の方法を説明するドキュメントが見つかりません。

次のLINQtoSQLクエリを変更したいと思います。

using(NorthwindContext northwind = new NorthwindContext()){
    var q=northwind.Customersの行から
            orderCount = row.Orders.Count()
            新しい{を選択します
                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 = northwind.Customers.With(
                        TableHint.NoLock、TableHint.Index(0))
            orderCount = row.Orders.With(
                        TableHint.HoldLock).Count()
            新しい{を選択します
                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>(
    このTable<TEntity>テーブル、
    params TableHint [] args)where TEntity:class {

    // TODO:実装
    リターンテーブル;
}
public static EntitySet <TEntity> With <TEntity>(
    このEntitySet<TEntity>entitySet、
    params TableHint [] args)where TEntity:class {

    // TODO:実装
    entitySetを返します。
}

パブリッククラスTableHint{
    // TODO:実装
    public static TableHint NoLock;
    public static TableHint HoldLock;
    public static TableHint Index(int id){
        nullを返します。
    }
    public static TableHint Index(文字列名){
        nullを返します。
    }
}

これ以外の、ある種のLINQtoSQL拡張性を使用する。何か案は?

4

2 に答える 2

10

基盤となるプロバイダーを変更してSQLを変更する機能では、LINQtoSQLの最終的なカットは行われませんでした。

于 2008-09-15T23:42:05.320 に答える
-1

DataContext x = new DataContext

もしかしてこういうこと?

var a = x.Where().with()...等

これにより、SQL をより細かく制御できます。

于 2008-09-15T16:48:59.450 に答える