Как добавить пользовательские столбцы в таблицу, которые LINQ to SQL может преобразовать в SQL - PullRequest
0 голосов
/ 26 августа 2009

У меня есть таблица, которая содержит коды процедур среди других данных (назовем это «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, которое выполняет связывание, и перенести это в контекст моих данных, но я хотел бы попытаться избежать этого. Любые идеи будут приветствоваться. Спасибо.

Ответы [ 2 ]

1 голос
/ 08 декабря 2009

Вы можете вставить AsEnumerable () в выражение запроса. Это преобразует все к этой точке в набор результатов, так что ваши пользовательские свойства могут быть включены в оставшуюся часть выражения (извините, я не использую VB):

var test = _
    (from x in dc.MyDatas 
    (select x.proc_code).AsEnumerable().
    Where(x => x.ProcedureDescription.Contains("test"));
0 голосов
/ 28 августа 2009

это не метод расширения, это свойство

VB.net Методы расширения: http://msdn.microsoft.com/en-us/library/bb384936.aspx

Рассмотрите возможность использования этого запроса в качестве хранимой процедуры, если это действительно важно.

...