【发布时间】:2013-04-09 06:56:26
【问题描述】:
我有一个相对简单的 LINQ 表达式,我需要将其转换为 VB 表达式树语法。对于熟悉的人来说,这可能是一件容易的事,但我是 LINQ 表达式树领域的新手。
在我的示例中,您会看到一个“New Int16() {}”数组。该值必须在运行时使用来自另一个代码元素的值数组进行参数化。
我的查询是:
from i in tblInstitutions
let ChildHasCategory = i.tblInstCtgyHistories.Where(Function(CtgyHist) CtgyHist.EndDate is Nothing AND ( (New Int16() {32,35,38,34}).Contains(CtgyHist.InstCtgyCodeFK)))
where ChildHasCategory.Any()
select i
也可以表示为:
tblInstitutions
.Select (i => new {
i = i,
ChildHasCategory = (IEnumerable<tblInstCtgyHistory>)(i.tblInstCtgyHistories)
.Where (
CtgyHist =>
((CtgyHist.EndDate == null) &
(IEnumerable<Int16>)(new Int16[] { 32, 35, 38, 34 } ).Contains (CtgyHist.InstCtgyCodeFK)
)
)
}
)
.Where ($VB$It => $VB$It.ChildHasCategory.Any ())
.Select ($VB$It => $VB$It.i)
这将在 ASP.NET 动态数据 Web 应用程序中的自定义过滤器上下文中使用。我想模仿默认方法。 其他动态过滤器代码隐藏示例之一是:
Public Overrides Function GetQueryable(source As IQueryable) As IQueryable
Dim value = TextBox1.Text
If String.IsNullOrWhiteSpace(value) Then
Return source
End If
If DefaultValues IsNot Nothing Then
DefaultValues(Column.Name) = value
End If
Dim parameter = Expression.Parameter(source.ElementType)
Dim columnProperty = Expression.PropertyOrField(parameter, Column.Name)
Dim likeValue = Expression.Constant(value, GetType(String))
Dim condition = Expression.Call(columnProperty, GetType(String).GetMethod("Contains"), likeValue)
Dim where = Expression.Call(GetType(Queryable), "Where", New Type() {source.ElementType}, source.Expression, Expression.Lambda(condition, parameter))
Return source.Provider.CreateQuery(where)
End Function
【问题讨论】:
-
查询可以简化为:from i in tblInstitutions where (i.tblInstCtgyHistories.Where(Function(CtgyHist) CtgyHist.EndDate is Nothing AND ((New Int16() {32,35,38,34 }).Contains(CtgyHist.InstCtgyCodeFK)))).Any() 选择 i
标签: vb.net linq api linq-to-sql lambda