我有以下型号
public class Entity
{
public List<FirstLevel> FirstLevel { get; set; }
}
public class FirstLevel
{
public int ElementId { get; set; }
}
我正在尝试使用 Linq ExpressionTree 获取每个具有 FirstLevel 元素和特定 ElementId 的实体。这个想法是将表达式转换为仅 SQL 请求,因为我不想加载每个实体客户端然后进行过滤。
我目前有那个表情
var parameter = Expression.Parameter(typeof(Entity), "e");
var anyPredicate = Expression.Lambda<Func<FirstLevel, bool>>(
Expression.Equal(Expression.Property(Expression.Parameter(typeof(FirstLevel), "fl"), "ElementId"), Expression.Constant(3)),
Expression.Parameter(typeof(FirstLevel), "fl"));
var anyMethod = typeof(Enumerable).GetMethods().Where(m => m.Name == "Any" && m.GetParameters().Length == 2).Single().MakeGenericMethod(typeof(FirstLevel));
var wherePredicate = Expression.Lambda<Func<Entity, bool>>(
Expression.Call(anyMethod, Expression.Property(parameter, "firstLevel"), anyPredicate),
parameter);
var result = context.Entities.Where(wherePredicate);
但是当它执行时我得到以下错误:
无法翻译 LINQ 表达式“fl”
在调试器中我可以看到创建的表达式是
{e => e.FirstLevel.Any(fl => (fl.ElementId == 1))}
我很惊讶不支持 lambda 表达式。还有其他方法可以使用表达式过滤列表吗?我错过了什么吗?
我正在使用 Entity Framework、.Net Core 6、SQL Server 2016。
注意:ExpressionTree 的使用不是强制性的,但我想我会更容易地获得可翻译的表达式。