我有一個相對簡單的LINQ表達式,我需要轉換成VB表達式樹語法。對於那些熟悉的人來說,這可能是一件容易的事,但我對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動態數據網絡的上下文中使用應用。我想模仿默認的方法。 其它動態過濾器的代碼隱藏的一個樣本是:
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
查詢可以被簡化爲:在tblInstitutions 從i其中(i.tblInstCtgyHistories.Where(功能(CtgyHist)CtgyHist.EndDate爲Nothing AND((新的Int16(){32,35,38,34})。包含(CtgyHist.InstCtgyCodeFK))))。Any() select i – mdonley