[英]Linq to Entities with custom method in Where
我有一个复杂的 LINQ 到实体查询,那里的时间太长了。 我想将其拆分为一些命名良好的方法,以便其他人可以理解它。 这篇文章似乎暗示只要我返回一个表达式 EF 可以翻译,我就可以做到这一点。 https://stackoverflow.com/a/18338476/4812782
这是我的简化代码。 我无法在过滤之前检索数据,因为它将超过 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;
}
我得到错误
无法将类型“System.Linq.Expressions.Expression>”隐式转换为“bool”。 无法将 lambda 表达式转换为预期的委托类型,因为块中的某些返回类型不能隐式转换为委托返回类型
任何帮助表示赞赏。
这是不正确的,如错误所示:
.Where(x => IsActiveVehicle())
那是创建一个包含您的表达式的新表达式。
您实际上希望将Expression<Func<>>
传递给.Where
。
var q = _context.vehicles
.Where(IsActiveVehicle())
.ToList()
注意您链接的问题/答案,您会看到它。
另一种看待它的方式:
.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)
我在这个具体的例子中看到你有 dunning-kruger 的答案。 但是正如你所说你想添加更多这样的线索,如果你要创建非常长时间运行和复杂的查询,我会建议你使用动态表达式来构建 linq 因为这也有助于你重用大部分所需的组件,因为我们主要遇到这种情况,我们需要这样的链接多个地方。 您可以查看此链接以获取更多详细信息
https://www.codeproject.com/Articles/1079028/Build-Lambda-Expressions-Dynamically
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.