[英]How to programmatically add JOINs to query from list using EF Core
我正在尝试使用 EF Core 从数据库中查询数据,但场景对我来说有点复杂。 我会尽量清楚并综合我想要完成的事情。
涉及三个表:
假设这些表的类如下。
public class WorkToDo
{
public int Id { get; set; }
public string Description { get; set; }
}
public class ParamDefinition
{
public int Id { get; set; }
public string Name { get; set; }
}
public class ParamValue
{
public int WorkToDoId { get; set; }
public int ParamDefinitionId { get; set; }
public string Value { get; set; }
}
我有一个 ParamValue 项目列表,其中填充了 ParamDefinitionId 和 Value,但没有 WorkToDoId。
我想查询与 ParamValue 项目匹配的所有 WorkToDo 项目,同时考虑所有ParamValue 项目,而不仅仅是其中的任何项目。
让我用每个表上的示例记录来解释:
要做的工作
ID | 描述 |
---|---|
1个 | 工作范例A |
2个 | 工作范例B |
PARAM_DEFINITIONS_FOR_WORK
ID | 名称 |
---|---|
101 | 参数定义 X |
102 | 参数定义 Y |
103 | 参数定义 W |
104 | 参数定义 Z |
105 | 参数定义 + |
PARAM_VALUES_FOR_WORK
WORK_TO_DO_ID | PARAM_DEFINITION_ID | 价值 |
---|---|---|
1个 | 101 | 参数值 J |
1个 | 102 | 参数值 K |
2个 | 103 | 参数值 L |
2个 | 104 | 参数值 M |
2个 | 105 | 参数值 N |
因此,假设我的 ParamValues 列表有两项: ParamDefinitionId = 101, Value = "Param Value J"
和ParamDefinitionId = 102, Value = "Param Value K"
。 我想检索 Id = 1 的 WorkToDo。
如果我的 ParamValues 列表包含三个项目:
ParamDefinitionId = 103, Value = "Param Value L"
ParamDefinitionId = 104, Value = "Param Value M"
ParamDefinitionId = 105, Value = "Param Value N"
然后我希望我的查询检索 Id = 2 的 WorkToDo。
请注意,ParamValues 列表的大小是可变的!
我想说我已经尝试了一个解决方案,但事实是我什至不知道如何开始。 我在 web 上搜索过,但没有成功。
我只知道如何使用 SQL 执行此操作:
SELECT DISTINCT WORK_TO_DO.ID, WORK_TO_DO.DESCRIPTION
FROM WORK_TO_DO
INNER JOIN PARAM_VALUES_FOR_WORK PV1 ON PV1.WORK_TO_DO_ID = WORK_TO_DO.ID
INNER JOIN PARAM_VALUES_FOR_WORK PV2 ON PV2.WORK_TO_DO_ID = WORK_TO_DO.ID
(... Adding as many INNER JOINs as needed based on list of ParamValues)
INNER JOIN PARAM_VALUES_FOR_WORK PVX ON PVX.WORK_TO_DO_ID = WORK_TO_DO.ID
WHERE PV1.PARAM_DEFINITION_ID = :ParamValues[0].ParamDefinitionId
AND PV1.VALUE = :ParamValues[0].Value
AND PV2.PARAM_DEFINITION_ID = :ParamValues[1].ParamDefinitionId
AND PV2.VALUE = :ParamValues[1].Value
(... Adding as many conditions as needed based on list of ParamValues)
AND PVX.PARAM_DEFINITION_ID = :ParamValues[X].ParamDefinitionId
AND PVX.VALUE = :ParamValues[X].Value
基本上,我想根据我的 ParamValues 列表将 JOIN 和过滤器添加到查询中。 我怎样才能做到这一点?
使用FilterByItems扩展,您可以生成所需的查询:
var requiredCount = ParamValues.Count();
var query = context.WorkToDo
.Where(w => context.ParamValue
.Where(pv = pv.WorkToDoId == w.Id)
.FilterByItems(ParamValues, (pv, v) => pv.ParamDefinitionId == v.ParamDefinitionId && pv.Value == v.Name, true)
.Count() >= requiredCount
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.