Создание лямбда-выражения динамически - PullRequest
0 голосов
/ 14 июля 2011

В Entity Framework я обычно делаю что-то вроде:

modelBuilder.Entity(Of Model).HasKey(Function(item As Model) New With {item.PropertyA, item.PropertyB })

для сопоставления составного первичного ключа

Мне нужно написать универсальную функцию, например:

modelBuilder.Entity(Of TModelo).HasKey( MakeLambda({“PropertyA”, “PropertyB” })

Private Function MakeLambda(Of TModelo)(nameProperties As String()) As Expression(Of Func(Of TModelo, Object))
        Dim type = GetType(TModelo)

        Dim listProperties As New List(Of Expression)
        Dim parameter = Expression.Parameter(type, "item")
        For Each n As String In nameProperties
            Dim refProperty = type.GetProperty(n)
            listProperties.Add(Expression.MakeMemberAccess(parameter, refProperty))
        Next

        Dim arrayInit = Expression.NewArrayInit(GetType(Object), listProperties)

В этой точке система не может создать новое выражение

        Dim newExpression = Expression.Lambda(Of Func(Of TModelo, Object))(arrayInit)

        Return newExpression
End Function

Может быть, у кого-то есть другое решение этой проблемы

1 Ответ

0 голосов
/ 02 сентября 2011

Это подойдет.динамическое newExpression = Expression.Lambda> (arrayInit, параметр);

Но это все еще не работает для меня все же.Мне нужно что-то вроде этого ...

HasKey(p => new { p.FAMILY, p.CACHE_FAMILY, p.CUSTOMER_CODE, p.CCC, p.OPERATION, p.EVAL_CODE, p.VDT_FLAG, p.TEST_PLATFORM, p.PCBA_VENDOR });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...