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