2013-03-29 91 views
2

我有一個相對簡單的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 
+0

查詢可以被簡化爲:在tblInstitutions 從i其中(i.tblInstCtgyHistories.Where(功能(CtgyHist)CtgyHist.EndDate爲Nothing AND((新的Int16(){32,35,38,34})。包含(CtgyHist.InstCtgyCodeFK))))。Any() select i – mdonley

回答

2

我不知道你真的需要在這裏擔心的表達式樹。首先,我們應該能夠表達你的查詢,如下所示:

Dim targetCodes = new Int16() {32, 35, 38, 34 } ' This could be data driven as well 
return from i in tblInstitutions 
     where i.tblInstCtgyHistories.Any(Function(ctgyHist) ctgyHist.EndDate is Nothing AndAlso 
       targetCodes.Contains(ctgyHist.InstCtgyCodeFK)) 
     select i 

鑑於這種情況,在什麼情況下,你需要自定義表達式樹?

+0

正確,查詢可以用這種方式表達。但是,我需要將其作爲可以作爲動態數據應用程序自定義過濾器的GetQueryable函數的一部分使用的格式。它使用表達式調用和API語法方法,因爲過濾器需要與動態數據應用程序的所有其他選定過濾器混合使用。我似乎無法找出Expression.Call和Expression.Parameter方法的正確組合來完成我所需要的。我相信,當它完成時,它可能只有4或5行代碼,但它是一個巨大的障礙。 – mdonley

+0

只要你仍然在查詢中工作,你應該能夠消耗和擴展表達式。 –