9

Linq to Sqlに関する記事を読んでいて、これに出くわしました。

IQueryProvider provider = new QueryProvider(database.GetCommand, database.ExecuteQuery);
IQueryable<Product> source = new Queryable<Product>(provider, database.GetTable<Product>());
IQueryable<string> results = source.Where(product => product.CategoryID == 2)
                                   .OrderBy(product => product.ProductName)
                                   .Select(product => product.ProductName)
                                   .Skip(5)
                                   .Take(10);

次に、著者は結果を単純な sql に変換しました。

exec sp_executesql N'SELECT [t1].[ProductName]
FROM (
SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ProductName]) AS [ROW_NUMBER], [t0].[ProductName]
FROM [dbo].[Products] AS [t0]
WHERE [t0].[CategoryID] > @p0
) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p1 + 1 AND @p1 + @p2
ORDER BY [t1].[ROW_NUMBER]',N'@p0 int,@p1 int,@p2 int',@p0=2,@p1=5,@p2=10

そして、私は心の中で「なんてこった! デバッグ時にこれらの文字列を生成する IQueryable の拡張機能があれば素晴らしいと思いませんか?」と思いました。

このようなことを聞​​いたことがある人はいますか?もしそうなら、正しい方向に向けてもらえますか?

ありがとう!

4

4 に答える 4

4

Linq to Sql を使用して呼び出すquery.Provider.ToString()と、クエリのテキストが返されます (ところで、デバッグ時に Visual Studio で同じプロパティを見ることができます)。

更新: (複雑な部分) どのように実装されていますか?

実際の文字列生成はSystem.Data.Linq.SqlClient.SqlProviderクラスごとに行われます。string IProvider.GetQueryText(Expression query)渡された式に基づいてSQLクエリテキストを構築する隠しメソッドがあります。このメソッドは内部インターフェイスによって隠されてIProviderいるため、呼び出すのは簡単なことではありません。

于 2012-10-25T15:24:43.420 に答える
2

Linqpadを使用して SQL と Linq を変換できると思います。

于 2012-10-25T15:10:40.223 に答える
2

DataContext.LogプロパティをTextWriter(eg Console.Out) に設定すると、生成された SQL を確認できますが、SQLを実行せずに出力することはできないと思います。

于 2012-10-25T15:14:00.750 に答える
1

ひどいハッキーな解決策:

前述のように使用DataContext.Logしますが、トランザクションとロールバックですべてをラップするだけです。;p

于 2012-10-25T15:56:32.993 に答える