В 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
Может быть, у кого-то есть другое решение этой проблемы