繁体   English   中英

Linq 到实体与自定义方法在哪里

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM