如何将自定义列添加到LINQ to SQL可以转换为SQL的表中

时间:2009-08-26 14:57:23

标签: vb.net linq linq-to-sql extension-methods

我有一个表包含其他数据中的过程代码(让我们称之为“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 个答案:

答案 0 :(得分:1)

您可以在查询表达式中插入AsEnumerable()。这会将所有内容转换为结果集,以便您的自定义属性可以包含在表达式的其余部分中(抱歉,我不做VB):

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

答案 1 :(得分:0)

这不是扩展方法,它是属性

VB.net扩展方法:http://msdn.microsoft.com/en-us/library/bb384936.aspx

如果它非常重要,请考虑将此查询用作存储过程。