2009-03-04 20 views
3

私は基本的にPROJECTSというテーブルで検索を返すこのLinq to SQLクエリシーケンスを持っています。私はゆっくりとそれを構築するために延期された実行を利用しています。Linqから単一のクエリで複数のDataContextを使用するSQL

var query = from p in objDBContext.PROJECTs 
where (p.PROVIDER_ID == cwForm.productForm) 
select p; 

query = from p in query 
where p.SubmittedDate >= cwForm.beginDateForm 
select p; 

LINQはISDATE()またはフルテキスト検索をサポートしていないので、私はヘルパー関数としてのスカラー値とテーブル値を返すいくつかのSQL関数を書きました。それらはProjectsテーブルと同じ.dbmlファイルにあります。

だから今私が持っている:

var dateQuery = from d in objDBContext.ISDATE 
select d; 
//returns a bool 

var ftsQuery = from f in objDBContext.FullTextSearch 
select f; 
//returns a valued-table with the primary keys of hits with fulltextsearch 

私の質問があり、私は元のクエリpにこれらの新しいobjDBContextsを使うのですか?また、executequery()を元のクエリに戻す方法を理解することにも興味があります。以下のような

何か:

query = from p in query 
     from d in dateQuery 
     from f in ftsQuery 
where d.ISDATE(p.Field1) && f.FullContextSearch(searchString)  

    select p; 

は、私はそれが理にかなって願っています。いくつかのタイプのミスマッチエラーがあり、しばらくの間グーグルで試してみましたが、何も見つかりませんでした。

答えて

2

あなたはすべての3のための同じインスタンスを使用して、コンテキストクラス上のすべてのメソッドを定義していますので:

var query = from p in objDBContext.Projects where 
    p.PROVIDER_ID == cwForm.productForm 
    && objDBContext.ISDATE(p.Field1) 
    && objDBContext.FullTextSearch(searchString) 
     //assuming FullTextSearch returns boolean 
    select p 

をFullTextSearchブール戻らない場合、あなたはありません式を構築する必要があります。 IListを返す場合と同様に、objDBContext.FullTextSearch(searchString).Contains(p)

あなたがしようとしていることは、あなたがそれをどのように切断しても3回の往復を引き起こすことに注意してください。この場合、あなたのSQLを手作りするほうが良いでしょう。 LINQ to SQLはSQLの100%を置き換えることはできません。

+0

ありがとうRex、これらのSQLのオーバーヘッドコストはいくらですか?私は、LINQ2SQLを使って動的SQLクエリを構築するという単純さと清潔さが本当に好きです。私のFullTextSearchは、searchStringと一致する行のインデックスキーを持つ値付きテーブルを返します。参加者はここで最も効果的でしょうか? – stevenjmyu

+0

個々のコストオーバーヘッドは特に大きいとは思いません。アプリケーションに慣れていなくても、言うことは難しいです。しかし、パフォーマンスの問題が発生すると、SQLへのラウンドトリップの回数は、常に最初に目にするものの1つです。 –

関連する問題