Linq を SQL に拡張するにはどうすればよいですか?
-
09-06-2019 - |
質問
昨年、スコット・ガスリー 述べました 「実行される 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 のブログには、そのために必要なものがすべて揃っています。
DataContext x = 新しい DataContext;
//おそらくこんな感じでしょうか?
var a = x.Where().with()...など
SQL をより細かく制御できるようになります。
所属していません StackOverflow