2012-09-21 4 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