我有一个表包含其他数据中的过程代码(让我们称之为“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视图来进行链接并将其带入我的数据上下文,但我想尽量避免这种情况。任何想法都会受到欢迎。感谢。
答案 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
如果它非常重要,请考虑将此查询用作存储过程。