gpt4 book ai didi

c# - 通过 count() 进行左连接和分组的 Linq 查询

转载 作者:行者123 更新时间:2023-11-30 17:06:43 32 4
gpt4 key购买 nike

如果我有一个包含许多条件的规则,并且用户选择了多个条件,我该如何编写一个 linq 查询来为我提供所有规则,其中该规则中的每个条件都与用户选择的条件一起存在?

这是我目前在 SQL 中的做法:

表格

rule:
ruleId int
categoryId int

ruleCriteria:
ruleId int,
criteriaId int

@userCriteria:
criteriaId int
categoryId int

查询

SELECT
r.ruleId
FROM dbo.rule r
INNER JOIN dbo.ruleCriteria rc ON r.ruleId= rc.ruleId
LEFT OUTER JOIN @userCriteria uc
ON rc.criteriaId = uc.criteriaId
AND r.categoryId = uc.categoryId
GROUP BY r.ruleId
HAVING COUNT(rc.criteriaId) = COUNT(uc.criteriaId)

对于 linq 查询,我将拥有这些对象(更加非规范化,但如果有帮助,我可以将它们放在与表相同的结构中):

userCriteria:
criteriaId int
categoryId int

ruleCriteria:
ruleId int
categoryId int
criteriaId int

我的目标与 SQL 查询相同,即获取不同的匹配规则列表。你会怎么做?

最佳答案

这个查询生成的 SQL 比另一个更好,而且更直接:

from rc in ruleCriterias
group rc by rc.ruleId into rules
where rules.All(rc => userCriterias.Any(uc =>
uc.criteriaId == rc.criteriaId && uc.categoryId == rc.categoryId))
select rules.Key

您应该确保所有列都是NOT NULL,因为如果它们不是,则必须生成额外的 SQL 来检查是否为空。

关于c# - 通过 count() 进行左连接和分组的 Linq 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15250620/

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