gpt4 book ai didi

c# - 如何在 LINQ to Entities 中为 Entity Framework 对象使用谓词

转载 作者:IT王子 更新时间:2023-10-29 04:29:21 26 4
gpt4 key购买 nike

我正在为我的数据访问层中的 Entity Framework 对象使用 LINQ to Entities。

我的目标是尽可能多地从数据库中进行过滤,而不对内存中的结果应用过滤逻辑。

为此,业务逻辑层将谓词传递给数据访问层。

我是说

Func<MyEntity, bool>

所以,如果我直接使用这个谓词,比如

public IQueryable<MyEntity> GetAllMatchedEntities(Func<MyEntity, Boolean> isMatched)
{
return qry = _Context.MyEntities.Where(x => isMatched(x));
}

我遇到了异常

[System.NotSupportedException] --- {"The LINQ expression node type 'Invoke' is not supported in LINQ to Entities."}

that question 中的解决方案建议使用 LINQKit 中的 AsExpandable() 方法图书馆。

但是再次使用

public IQueryable<MyEntity> GetAllMatchedEntities(Func<MyEntity, Boolean> isMatched)
{
return qry = _Context.MyEntities.AsExpandable().Where(x => isMatched(x));
}

我遇到了异常

Unable to cast object of type 'System.Linq.Expressions.FieldExpression' to type 'System.Linq.Expressions.LambdaExpression'

有没有办法在 LINQ to Entities 查询 Entity Framework 对象时使用谓词,以便将其正确转换为 SQL 语句。

谢谢。

最佳答案

您不需要 LinqKit 来执行此操作。只记得使用

Expression<Func<MyEntity, bool>>

代替

Func<MyEntity, bool>

像这样:

public IQueryable<MyEntity> GetAllMatchedEntities(Expression<Func<MyEntity, Boolean>> predicate)
{
return _Context.MyEntities.Where(predicate);
}

您必须使用 Expression,因为 Linq to Entities 需要将您的 lambda 转换为 SQL。

当您使用 Func 时,您的 lambda 被编译为 IL,但当使用 Expression 时,它是 Linq to Entities 可以横向和转换的表达式树。

这适用于 Linq to Entities 理解的表达式。

如果它一直失败,那么您的表达式会执行一些 Linq to Entities 无法转换为 SQL 的操作。在那种情况下,我认为 LinqKit 不会有所帮助。

编辑:

不需要转换。只需使用 Expression 参数定义方法 GetAllMatchedEntities 并按照与 Func 参数相同的方式使用它。编译器会完成剩下的工作。

您可以通过三种方式使用 GetAllMatchedEntities。

1) 使用内联 lambda 表达式:

this.GetAllMatchedEntities(x => x.Age > 18)

2) 将你的表达式定义为一个字段(也可以是一个变量)

private readonly Expression<Func<MyEntity, bool>> IsMatch = x => x.Age > 18;
...then use it
this.GetAllMatchedEntities(IsMatch)

3) 您可以手动创建表达式。缩减是更多的代码,你错过了编译时检查。

public Expression<Func<MyEntity, bool>>  IsMatchedExpression()
{
var parameterExpression = Expression.Parameter(typeof (MyEntity));
var propertyOrField = Expression.PropertyOrField(parameterExpression, "Age");
var binaryExpression = Expression.GreaterThan(propertyOrField, Expression.Constant(18));
return Expression.Lambda<Func<MyEntity, bool>>(binaryExpression, parameterExpression);
}

关于c# - 如何在 LINQ to Entities 中为 Entity Framework 对象使用谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19616711/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com