2012-10-25 3 views
9

私はLinq to Sql上の記事を読んで、これに出くわした:IQueryable <T>ラムダ式をSQL文字列に変換するAPIまたは拡張機能はありますか?

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 

をそして私は「聖なる牛wouldn」、自分自身に考えました!デバッグ時にこれらの文字列を生成するIQueryableの拡張機能があればそれは素晴らしいでしょうか?

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

ありがとうございます!

+2

http://msdn.microsoft.com/en-us/library/bb386961.aspx – Servy

+0

一般的な動作の背景については、http://msdn.microsoft.com/en-us/を参照してください。 /library/bb399342.aspx – AakashM

答えて

4

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

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

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

+0

これはあまりにも単純すぎるようです:p – Rawling

+0

@Rawling申し訳ありませんが、私たちは後でそれを複雑にすることができます:) –

2

私はLinqpadは、SQLとLinq間の変換に使用できると思っています。

+0

あなたはlinqpadを使ってどうやってやりますか? –

2

あなたはそれが生成されるSQL を見て、私は、これはそれを実行せずに、あなたの出力SQL できないと思います(例えばConsole.OutTextWriterDataContext.Logプロパティを設定することができます。

+3

'StringBuilder'に書き込む' StringWriter'に設定することもできますし、直接ファイルに書き込むように設定することもできます。これらはコンソールの一般的な選択肢です。 – Servy

+0

@Servy:+1 'StringWriter'は一般的に多くの目的に理想的な、まれにしか使われないタイプの1つです。 – leppie

1

ひどいハックソリューション:

使用DataContext.Logは先に述べたが、ちょうどトランザクションとロールバックのすべてを包みます。 ; p

関連する問題