2009-08-26 46 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 

因爲有很多地方我想說明的過程描述,這就會變得混亂。我想在一個地方定義的查詢,所以我試圖把這個在邁德特的擴展:

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可以識別的內容,以便我可以在一個地方定義它,並且只需引用描述就好像它是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 2009-12-08 13:38:56