我正在尝试将动态生成的 LambdaExpression 传递给 IncludeFilter,如下所示:
编辑:我已将测试代码更改为以下内容,因为(正确地)我没有实现我的“Where”语句。正在生成正确的 where 语句,但我无法将 lambda 语句传递给 IncludeFilter 调用:
DbSet<MyTestEntity> dbSet = db.Set<MyTestEntity>();
ParameterExpression parameter = Expression.Parameter(typeof(MyTestEntity), "t");
Expression idProperty = Expression.Property(parameter, "mytestentityid");
Expression delProperty = Expression.Property(parameter, "deleted");
Expression delTarget = Expression.Constant(false, typeof(bool));
Expression deletedMethod = Expression.Call(delProperty, "Equals", null, delTarget);
Expression<Func<MyTestEntity, bool>> lambda = Expression.Lambda<Func<MyTestEntity, bool>>(deletedMethod, parameter);
IQueryable<MyTestEntity> query = dbSet.Where(lambda);
Console.WriteLine("Current Query: {0}", query.ToString());
foreach (string include in includes)
{
Type subType = db.GetType().Assembly.GetTypes().SingleOrDefault(x => x.Name.EndsWith(include));
Assert.IsNotNull(subType);
ParameterExpression innerParam = Expression.Parameter(subType, subType.Name);
Assert.IsNotNull(innerParam);
MemberExpression inrDelProp = Expression.Property(innerParam, "deleted");
Assert.IsNotNull(inrDelProp);
ConstantExpression inrDelCstProp = Expression.Constant(false, typeof(bool));
Assert.IsNotNull(inrDelCstProp);
MethodCallExpression inrDelMthd = Expression.Call(inrDelProp, "Equals", null, inrDelCstProp);
Assert.IsNotNull(inrDelMthd);
var delegateType = typeof(Func<,>).MakeGenericType(subType, typeof(bool));
dynamic inrLmbdaExpr = Expression.Lambda(delegateType, inrDelMthd, innerParam);
Assert.IsNotNull(inrLmbdaExpr);
Console.WriteLine("inrLmbdaExpr: {0}", inrLmbdaExpr.ToString()); // Result: MyTestEntityChild => MyTestEntityChild.deleted.Equals(false)
query = query.IncludeFilter(inrLmbdaExpr); // ERROR HERE
Assert.IsNotNull(query);
Console.WriteLine("-------------------------------------------------");
Console.WriteLine("Current Query: {0}", query.ToString());
}
它内置在一个抽象类中,允许我传入实体类型、检索记录并重用该方法,而与实体类型无关;但是,我也在尝试过滤掉标记为已删除的子实体(因此使用 EF+)。
我怎样才能做到这一点?
编辑 2:所以,我意识到我的解决方案中也有 Linq.Dynamic.Core (!),所以我已经可以从字符串解析 LambdaExpression。但是,我得到的错误是 IncludeFilter 不知道它正在尝试使用哪种方法。(我在对象浏览器中看到一个使用 Expression>,一个使用 Expression>>。如果我能弄清楚如何让 IncludeFilter 识别哪种方法,我想我已经完成了!这是我的代码示例已经改写:
string myIncStr = String.Format("x => x.{0}.Where(s => s.deleted.Equals(false)).Where(x => x.MyEntityId.Equals(IncomingId)",includedEntityName);
IEnumerable<MyEntity> result = db.MyEntity.IncludeFilter(System.Linq.Dynamic.Core.DynamicExpressionParser.ParseLambda(typeof(MyChildEntity), myIncStr, null));
有没有办法“强制”(因为没有更好的术语) IncludeFilter 使用一种方法?是通过在解析器中传递一个值而不是 null 吗?
顺便说一句,感谢您的帮助。您的 EFP 库实际上非常出色。