gpt4 book ai didi

c# - Entity Framework 共享查询

转载 作者:行者123 更新时间:2023-11-30 20:27:55 25 4
gpt4 key购买 nike

我不太会说这个,所以我只是想解释一下我的情况。

我有一个场景,我有一个 TerminationDate EmploymentHistory 上的字段可以为 null 或 future 日期的表。 EmploymentHistory加入 Employees表,它是 1:M 关系,其中单个 Employee可以有多个 EmploymentHistory记录。那Employees表连接到很多不同的地方,例如 Users表示前端门户的表 Employees可以登录。

我经常需要只抓取活跃的员工。激活的SQL逻辑是WHERE TerminationDate IS NULL OR TerminationDate >= GETDATE() .因此,如果 TerminationDate 为 null 或者它是在将来设置的。

所以在 EF 中我有这样的查询:

// Grab all Active Employees
context.Employees.Where(e => e.EmploymentHistory.Any(eh => eh.TerminationDate == null || eh.TerminationDate >= DateTime.Today).ToList();

// Get all Users
context.Users.Where(u => u.Employee.EmploymentHistory.Any(eh => eh.TerminationDate == null || eh.TerminationDate >= DateTime.Today).ToList();

等等

此逻辑出现在大约 5 个不同的地方。如何分享 EmploymentHistory.Any(eh => eh.TerminationDate == null || eh.TerminationDate >= DateTime.Today基本导航 Prop 可能不同时的部分逻辑?试过玩 Expression<Func<T, bool>>但是除了我认为我有一个解决方案之外没有其他地方,如果我可以让所有需要这个的实体从一个基地继承并且可以总是假设有一个名为 Employee 的导航 Prop 坐在那里并且基地是我的 T .如果我尝试扩展方法,EF Core 只能在客户端对其进行评估,而不能在服务器端进行评估。

最佳答案

你可以为 EmploymentHistory 写一个表达式: Expression<Func<EmploymentHistory, bool>> activeEmployee = eh => eh.TerminationDate == null || eh.TerminationDate >= DateTime.Today;

然后像这样使用它:
context.Employees.Where(e => e.EmploymentHistory.Any(activeEmployee)).ToList();

context.Users.Where(u => u.Employee.EmploymentHistory.Any(activeEmployee)).ToList(); .

这并不是代码量的大幅减少,而是输入次数的减少,如果您出于某种原因需要更改逻辑并且不想在所有地方都进行更改,那就更好了。

关于c# - Entity Framework 共享查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48104865/

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