1

我正在尝试动态应用表达式过滤器并且无法使其正常工作。你们中的任何人都知道,如何在 for each 循环中应用给定的表达式过滤器,然后在匹配时返回类型 t 的对象?

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
4

1 回答 1

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实现所做的任何事情)。
对于所有其他情况,您应该接受 aFunc(Of T, Boolean)而不是表达式树,因为您实际上并不需要表达式树。Compile()是一个昂贵的电话。

于 2012-09-21T02:45:45.427 回答