У меня есть таблица, которая содержит коды процедур среди других данных (назовем это «MyData»). У меня есть другая таблица, которая содержит действительные коды процедур, их описания и даты, в которые эти коды действительны. Каждый раз, когда я хочу сообщить о MyData и добавить описание процедуры, я должен выполнить поиск, подобный следующему:
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
Так как есть много мест, где я хочу показать описание процедуры, это становится грязным. Я хотел бы, чтобы поиск был определен в одном месте, поэтому я попытался поместить это в расширение 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 может распознать, чтобы я мог определить его в одном месте и просто ссылаться на описание, как если бы это было поле в MyData? Пока что я могу думать только о том, чтобы создать представление MyData для SQL, которое выполняет связывание, и перенести это в контекст моих данных, но я хотел бы попытаться избежать этого. Любые идеи будут приветствоваться. Спасибо.