Linq Lambda 表达式无法翻译

问题描述 投票:0回答:0

我有以下型号

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 的使用不是强制性的,但我想我会更容易地获得可翻译的表达式。

entity-framework linq expression-trees
© www.soinside.com 2019 - 2024. All rights reserved.