2014-12-31 4 views
2

동적 메서드를 사용하여 개체 목록을 정렬합니다.null 값을 가진 필드를 정렬하는 식 람다

For Each Sort In MesDonnees.MesOptions 
    If Sort.Sens < 2 Then 
     Dim sortPropertyName As String = Sort.ColName 

     If (TypeClass.GetProperties().Any(Function(prop) prop.Name = sortPropertyName AndAlso prop.CanRead)) Then 

      'Information sur la propriété recherchée 
      Dim pinfo As PropertyInfo = TypeClass.GetProperty(sortPropertyName) 

      Dim Expr As Expression = Expression.Property(paramExpr, pinfo) 
      Dim Tostr As Expression = Expression.Call(Expr, "ToString", Nothing) 

      Dim orderByFunc As Func(Of MaClass, Object) = Expression.Lambda(Of Func(Of MaClass, Object))(Tostr, paramExpr).Compile() 
      Dim sortFunc As Func(Of IEnumerable(Of MaClass), IOrderedEnumerable(Of MaClass)) = Nothing 

      If (Not CBool(Sort.Sens)) Then 
       sortFunc = (Function(source) source.OrderBy(orderByFunc)) 
      Else 
       sortFunc = (Function(source) source.OrderByDescending(orderByFunc)) 
      End If 

      query = sortFunc(query).ToList() 

     End If 
    End If 
Next 

Sort.ColName 내가 필터링 할 내 필드의 이름입니다.

내가 더 널 (null) 값이없는 경우, 그것은 완벽하지만 난 널 값을 가질 때, 나는 라인 query = sortFunc(query).ToList()에 예외를 얻을 : 객체

의 인스턴스로 설정되지

개체 참조

Expression.CallISNullOrEmpty으로 다른 코드가 표시되지만 내 경우 올바르게 사용하는 방법을 모르겠습니다. 나는 널 (null)을 원한다. 올바른 표현은 상수이다 당신의 도움과 설명은

덕분에

답변

2

당신은 Coalesce 작업을 포함하도록 toStr 표현을 변경할 수 있습니다. 왼쪽 표현식은 참조 유형 (nullable value type)이어야하므로 속성 유형이 값 유형이 아닌지 확인해야합니다.

Dim toStr As Expression = Expression.Call(
    If(pinfo.PropertyType.IsValueType, expr, Expression.Coalesce(expr, Expression.Constant(String.Empty))), 
    "ToString", 
    Nothing 
) 
+1

완벽한 @ 비요른 - 로저 Kringsjå을 :

여기에 작동합니다 예입니다. 실행 중입니다. – YannickIngenierie