1

式フィルターを動的に適用しようとしていますが、機能しません。for each ループ内で特定の式フィルターを適用し、一致したときに Type 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)。他のすべてのケースでは、実際には式ツリーは必要ないため、式ツリーではなく
a を受け入れる必要があります。高額な通話です。Func(Of T, Boolean)Compile()

于 2012-09-21T02:45:45.427 に答える