Linq to Entities 在 Where 中使用自定义方法

Linq to Entities with custom method in Where

我有一个复杂的 LINQ to Entities 查询,其中 where 变得太长了。我想将其拆分为一些命名良好的方法,以便其他人可以理解。这个 post 似乎暗示我可以这样做,只要我返回一个 Expression EF 可以翻译。

这是我的简化代码。我无法在过滤前检索数据,因为它将超过 100,000 条记录。我的数据库是 Oracle。

var q = _context.vehicles
    .Where(x => IsActiveVehicle())
    .ToList()

Expression<Func<tb_vehicle, bool>> IsActiveVehicle()
            {
                return vehicle => vehicle.type == "R" &&
                       vehicle.status != "E" &&
                       vehicle.deleted == false;
            }

我收到错误

Cannot implicity convert type 'System.Linq.Expressions.Expression>' to 'bool'. Cannot convert lambda expression to intended delegate type because some of the return types in the block are not implicitly convertible to the delegate return type

感谢任何帮助。

这是不正确的,如错误所述:

.Where(x => IsActiveVehicle())

即创建一个包含您的表达式的新表达式。

您实际上想将 Expression<Func<>> 传递给 .Where

var q = _context.vehicles
    .Where(IsActiveVehicle())
    .ToList()

关注您链接的question/answer,您会看到它。


另一种看待它的方式:

.Where(x => IsActiveVehicle())

表示以下无意义:

.Where(x => ((vehicle) => vehicle.type == "R" &&
                       vehicle.status != "E" &&
                       vehicle.deleted == false))

然而,这:

.Where(IsActiveVehicle())

表示如下,更有意义:

.Where(vehicle => vehicle.type == "R" &&
                       vehicle.status != "E" &&
                       vehicle.deleted == false)