2012-09-21 65 views
1

我想動態地應用表達式篩選器,並且無法使其工作。你們中的任何人都知道,如何在每個循環內應用給定的表達式過濾器,然後在匹配時返回類型t的對象?IEnumerable上的表達式篩選器

Public Function FindByCondition(_ 
      filter As Expressions.Expression(Of Func(Of T, Boolean))) As T Implements IRepository(Of T).FindByCondition 
    Dim metaData As New LinqMetaData 

    AutoMapper.Mapper.CreateMap(GetType(EntityType), GetEntityType) 

    Dim dataSource = TryCast(metaData.GetQueryableForEntity(CInt([Enum].Parse(GetType(EntityType), GetEntityType.Name))), IQueryable(Of EntityBase)) 

    Dim q = (From p In dataSource _ 
      Select p).ToList 

    Dim g = AutoMapper.Mapper.Map(Of IEnumerable(Of T))(q) 

    For Each k As T In g 
     k.Equals(filter) 
    Next 



End Function 

回答

3

您需要將表達式樹編譯爲委託,然後在每個實例上調用委託。

Dim compiled As Func(Of T, Boolean) = filter.Compile() 

If compiled(k) Then 

,或者更簡單,

Return g.FirstOrDefault(compiled) 

或者,更簡單地說,

Return AutoMapper.Map(Of T)(dataSource.FirstOrDefault(filter)) 

這將實際運行在服務器上的過濾器(或任何你IQueryable實現不)。
對於所有其他情況,您應該接受Func(Of T, Boolean)而不是表達式樹,因爲您實際上不需要表達式樹。 Compile()是一個昂貴的電話。

+0

請問您能提供一些代碼嗎? – Baahubali

+0

謝謝你。這樣可行!!哇噢!! – Baahubali