2009-08-26 10 views
0

他のデータの中にプロシージャコードを含むテーブルがあります(「MyData」としましょう)。私は、有効なプロシージャコード、その説明、およびそれらのコードが有効な日付を含む別のテーブルを持っています。私はのMyDataに報告したいと手順の説明を含め、私はこれに類似検索を行う必要があるたびに:私は手順の説明を表示したい多くの場所があるのでLINQ to SQLがSQLに変換できるテーブルにカスタム列を追加する方法

From m in dc.MyDatas _ 
Join p in dc.Procedures On m.proc_code Equals p.proc_code _ 
Where p.start_date <= m.event_date _ 
And If(p.end_date.HasValue, p.end_date.Value, Now) >= m.event_date _ 
Select m.proc_code, p.proc_desc 

が、これは厄介な取得します。私は1つの場所で定義されたルックアップを持っているしたいと思いますので、私はのMyDataの拡張でこれを入れてみました:

Partial Public Class MyData 
    Public ReadOnly Property ProcedureDescription() As String 
     Get 
      Dim dc As New MyDataContext 

      Return _ 
       (From p in dc.Procedures _ 
       Where p.proc_code = Me.proc_code _ 
       And p.start_date <= Me.event_date _ 
       And If(p.end_date.HasValue, p.end_date.Value, Now) >= Me.event_date _ 
       Select p.proc_desc).SingleOrDefault 
     End Get 
    End Property 
End Class 

データを表示するときに動作しますが、あなたは、クエリで使用することはできません、それ理由SQL文にそれを有効にする方法を知らない:

Dim test = _ 
    From x In dc.MyDatas _ 
    Select x.proc_code _ 
    Where x.ProcedureDescription.Contains("test") 

エラー:メンバーのMyProject.MyData.ProcedureDescription「SQLへのサポートの翻訳を持っていません。

このような複雑なルックアップ(つまり、単純ではない結合)をSQLが認識できるようにする方法はありますか?私はそれを1つの場所に定義し、MyDataのフィールドであるかのように記述するだけです?これまで私が考えることができるのは、MyDataでSQLビューを作成し、それをリンクしてデータ・コンテキストに取り込むことですが、それを回避しようとしています。どんなアイデアも歓迎されます。ありがとう。

答えて

1

クエリ式にAsEnumerable()を挿入できます。それは(申し訳ありませんが、私はVBをしない)カスタムプロパティは、式の残りの部分に含めることができるように、結果セットにその時点までのすべてを変換します:

var test = _ 
    (from x in dc.MyDatas 
    (select x.proc_code).AsEnumerable(). 
    Where(x => x.ProcedureDescription.Contains("test")); 
+0

私は似たような状況に類似した何かをやりましたしかし、ここで問題となるのは、 "MyData"が膨大になる可能性があり、クエリの狭い部分が結果セットへの変換後に来るということです。しかし、大部分の状況ではまだ有効な答えです。 – gfrizzle

0

これは

VB.net拡張メソッド、プロパティの、拡張メソッドではありません。それは本当に重要だ場合http://msdn.microsoft.com/en-us/library/bb384936.aspx

がストアド・プロシージャとして、このクエリを使用することを検討してください。

関連する問題