昨年、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拡張性を使用する。何か案は?