Я задал очень похожий вопрос вчера, но только сегодня я понял, что ответ, который я принял, не решает всех моих проблем.У меня есть следующий код:
public Expression<Func<TItem, object>> SelectExpression<TItem>(string fieldName)
{
var param = Expression.Parameter(typeof(TItem), "item");
var field = Expression.Property(param, fieldName);
return Expression.Lambda<Func<TItem, object>>(field,
new ParameterExpression[] { param });
}
, который используется следующим образом:
string primaryKey = _map.GetPrimaryKeys(typeof(TOriginator)).Single();
var primaryKeyExpression = SelectExpression<TOriginator>(primaryKey);
var primaryKeyResults = query.Select(primaryKeyExpression).ToList();
Это позволяет мне извлечь первичные ключи из IQueryable<TUnknown>
.Проблема в том, что этот код работает только с одним первичным ключом, и мне нужно добавить поддержку нескольких PK.
Итак, есть ли способ, как я могу адаптировать метод SelectExpression
, описанный выше, чтобы взять IEnumerable<string>
(это мой список имен свойств первичного ключа) и заставить метод вернуть выражение, которое выбирает эти ключи?
Т.е. с учетом следующего:
var knownRuntimePrimaryKeys = new string[] { "CustomerId", "OrderId" }`
Для My Select необходимо выполнить следующее (во время выполнения):
var primaryKeys = query.Select(x=> new { x.CustomerId, x.OrderId });