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)
我有一个复杂的 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)