【发布时间】:2017-09-24 17:08:13
【问题描述】:
考虑以下问题。 (可行,但我需要将 Accounts 作为字符串传入。Accounts 是 Account 列表)
repo = repo.Where(x => x.Accounts.Any(p => p.Id == 1));
这是我目前所拥有的,但最后我似乎无法将它们连接在一起。
var parameterExp = Expression.Parameter(typeof(Car), "x");
Expression propertyExp = Expression.Property(parameterExp, "Accounts");
//Type elementType = propertyExp.Type.GetGenericArguments()[0];
MethodInfo AnyMethod = typeof(Enumerable).GetMethods(BindingFlags.Public | BindingFlags.Static).First(m => m.Name == "Any");
var parameterExp2 = Expression.Parameter(typeof(Car), "p");
var idExpr = Expression.PropertyOrField(parameterExp2, "Id");
MethodInfo method = typeof(long).GetMethod("Equals", new[] { typeof(long) });
var _relatedToId = Expression.Constant(relatedToId, typeof(long));
var equalsMethodExp = Expression.Call(idExpr, method, _relatedToId);
// This is where it breaks. I can't seem to wire it together correctly.
var call = Expression.Call(
AnyMethod,
propertyExp,
equalsMethodExp);
Expression<Func<Car, bool>> predicate = Expression.Lambda<Func<Car, bool>>(call, parameterExp);
// Need to return x => x.Accounts.Any(p => p.Id.Equals(1))
return predicate;
提前致谢
【问题讨论】:
-
请解释
x和p的类型 -
x 是 Car 类型,p 是 Account 类型,其中“Accounts”是 Account 列表。即 MyCar.Accounts
标签: c# linq lambda tree expression