Боюсь, вы не можете сделать это, потому что по сути вы получаете доступ к свойству, которое объявлено в интерфейсе.LINQ-to-Entities, кажется, не поддерживает это;вам нужно вызвать свойство в типе реальной сущности.
Один из способов, которым вы могли бы решить это, - передать свойство parcelId
в виде дерева выражений в параметре, а затем динамически построить лямбда-выражение во время выполнения, используясвойство в этом параметре:
public bool MakePayment(TPayment payment,
Expression<Func<TParcel, int>> parcelIdExpr)
{
// You can use any expression involving parcelId here
Expression<Func<int, bool>> expr = parcelId => parcelId == 2;
// This is the parameter of the new lambda we’re creating
var parameter = Expression.Parameter(typeof(TParcel));
// This constructs the lambda expression “p => expr(p.ParcelId)”,
// where “expr” is the lambda expression declared above
var lambda = Expression.Lambda(Expression.Invoke(expr,
Expression.Invoke(parcelIdExpr, parameter)), parameter);
ParcelRepository.Get((Expression<Func<TParcel, bool>>) lambda);
}
[...]
myFinanceService.MakePayment(myPayment, p => p.ParcelId);
Если вы не хотите, чтобы этот дополнительный параметр передавался каждый раз, когда вы вызываете MakePayment
, то теоретически вы можете получить свойство по имени со строковым литералом;однако, это небезопасно, потому что это не гарантирует, что это правильное свойство, которое реализует интерфейс.Кроме того, это очень обходной способ сделать это, поэтому никаких гарантий:
public bool MakePayment(TPayment payment)
{
Expression<Func<int, bool>> expr = parcelId => parcelId == 2;
var parameter = Expression.Parameter(typeof(TParcel));
// This is the expression “p.ParcelId”, where “p” is the parameter
var propertyExpression = Expression.Property(parameter, "ParcelId");
var lambda = Expression.Lambda(Expression.Invoke(expr, propertyExpression),
parameter);
ParcelRepository.Get((Expression<Func<TParcel, bool>>) lambda);
}
Вы можете выделить это в универсальный служебный метод:
public static class Utils
{
public static Expression<Func<TParameter, TResult>>
CombineLambdas<TParameter, T, TResult>(
Expression<Func<TParameter, T>> lambda1,
Expression<Func<T, TResult>> lambda2
)
{
var parameter = Expression.Parameter(typeof(TParameter));
var lambda = Expression.Lambda(Expression.Invoke(lambda2,
Expression.Invoke(lambda1, parameter)), parameter);
return (Expression<Func<TParameter, TResult>>) lambda;
}
}
public bool MakePayment(TPayment payment,
Expression<Func<TParcel, int>> parcelIdExpr)
{
ParcelRepository.Get(Utils.CombineLambdas(
parcelIdExpr, parcelId => parcelId == 2));
}