2010-12-14 20 views
1

のは、私は次のクエリを持っているとしましょう:亜音速 - SQLクエリ/ DataReaderオブジェクトにLINQクエリを変換

int x = 5; 
var result = from p in db.products 
      where p.CategoryId == x 
      select p; 

int count = result.Count(); 
List<product> products = result.ToList(); 

私が今持っているものだそれ。しかしaditionally、私は結​​果からDataReaderを持っている必要があります:

// that's what I need: 
var reader = ConvertSubSonicLinqQueryToDataReader(result); 

私は私が働くことができる何かにLINQ文を変換することができますどのように? DataReaderまたはDbCommand、またはパラメタのリストを含むプレーンなSQLです。

私はSubSonicがこれを行うことができますが(これはクエリがプレーンなSQLに変換されるためです)、パブリックアクセス可能なメソッドではまだ何も見つかりませんでした。

提案がありますか?

+0

DataReaderで何をしたいですか?たぶん私たちが代わりに提案できるものがあります。 –

+0

私は第三者メソッドにDataReaderを渡す必要があります(InlineQueryを使用できるように、linqクエリをプレーンなSQL文にコンパイルするだけで十分でしょう) –

答えて

1

LINQクエリを変換するのは間違った方法です。 LINQは、DataReaderが動作するよりも高い抽象レベルで結果を返します。

LINQクエリが単一のSQL文として実行されないように、遅延実行の問題もあります。

代わりにSqlQueryを使用するだけではなく、LINQ文を使用するのはなぜですか?

var qry = new Select().From(Product.Schema).Where(Product.CategoryIdColumn).IsEqualTo(x); 

return qry.ExecuteReader(); 

編集:
ちょうどあなたがSubSonic3を使用している(いない2上記のコードとしては、ためになる)が、LINQと作業の重複の可能性悪用はまだ立って見て。

+0

Linqクエリは最初の式であり、get (私の例では2つのステートメント、 'Count()'と 'ToList()'が含まれています)。 SubSonicは特定のIQuerable を 'IDataReader'や' IDbCommand'のようなものに変換する能力が必要です。サブソニックはdbmsに対してそれを実行する必要があるためです。おそらく、その方法は公開されているインターフェイスatmにはありませんが、私は何とかそれを把握すると確信しています。 Btw。説明するのは難しいですが、別のソースからIQuerableを取得するため、querytoolを使用することはできません。 –

+0

@SchlaWiener 'IQueryable 'を 'IDataReader'に変換するには' SubSonic.core'のソースを掘り下げます。まず、 'SubSonic.Linq.Strucutre.QueryCompiler'と' SubSonic.SqlGenerator'を見てみましょう。 –

0

DataReaderからオブジェクトを作成するコードは、DbDataProvider.ToEnumerableにあります。 DbQueryProviderのExecuteメソッド(227行目)から呼び出されます。 LINQの魔法を「理解する」ための最良の方法は、DbQueryProviderメソッドにいくつかのブレークポイントを配置することです。