gpt4 book ai didi

c# - Linq 多级动态 where 子句

转载 作者:行者123 更新时间:2023-11-30 22:28:08 28 4
gpt4 key购买 nike

首先要说的是,我在这里搜索并阅读了很多关于动态 where 子句的主题,以及 ScottGu 的博客和 Albahari 的 PredicateBuilder 类,但我不确定如何正确应用任何这些方法对我的情况。不知何故,我无法理解它。

我有以下代码,当像这样“静态”完成时可以工作:

var persons = from father in fathers
select new
{
Count = father.Sons
.Select(son => son)
.Where(son => son.Skills.Any(skill => skill.SkillType == "Languages" && skill.Name == "French"))
.Where(son => son.Skills.Any(skill => skill.SkillType == "Sport" && skill.Name == "Football"))
.Count(),

Name = father.Name
};

但是,我希望在运行时生成 where 子句。父对象具有 Son 对象的集合,而 Son 对象又具有 Skills 对象的集合。如查询所示,我想知道每位父亲的姓名以及他们拥有某种技能的儿子的数量。技能集将在运行时选择,因此即使在示例中我们只有两组技能(2 个 where 子句),在运行时也可以是 10 个或任意数量的子句。

我认为我最大的问题是我似乎无法根据我的情况调整 StackOverflow 上给出的答案示例,因为我需要从顶层(父亲)获取信息以及从第 3 层获取信息与第 2 级(儿子)的信息有关的级别(技能)。

如果需要,我将在明天发布我已经尝试过的示例代码。我现在不能这样做,因为我有点匆忙。任何帮助将不胜感激。

编辑:

我需要的是一种在运行时连接 where 子句的方法,这取决于用户选择了多少过滤条件。不同的过滤条件是从外部来源获取的,并在运行时构建。例如:

在场景一中,可能有 3 个条件,例如用户选择的条件 1、条件 2 和条件 3。场景 2 可能有 5 个标准,比如 criteria1、criteria2、...、criteria5。第三种情况可能有 10 个标准,例如标准 1、标准 2、...、标准 10。我需要的是能够针对每个场景执行以下操作,而无需事先知道是否会有 3、5、10 或任何标准。

场景一:

var persons = from father in fathers
select new
{
Count = father.Sons
.Select(son => son)
.Where(criteria1)
.Where(criteria2)
.Where(criteria3)
.Count(),

Name = father.Name
};

场景 2:

var persons = from father in fathers
select new
{
Count = father.Sons
.Select(son => son)
.Where(criteria1)
.Where(criteria2)
.Where(criteria3)
.Where(criteria4)
.Where(criteria5)
.Count(),

Name = father.Name
};

场景 3:

var persons = from father in fathers
select new
{
Count = father.Sons
.Select(son => son)
.Where(criteria1)
.Where(criteria2)
.Where(criteria3)
.Where(criteria4)
.Where(criteria5)
.Where(criteria6)
.Where(criteria7)
.Where(criteria8)
.Where(criteria9)
.Where(criteria10)
.Count(),
Name = father.Name
};

最佳答案

jonnyGold 的回答很好,但它要求 Son 对象有对 father 对象的引用。这是一个不需要的解决方案:

var query = from father in fathers
from son in father.Sons
select new {father, son};

foreach (Skill skillCriterion in CriterionSkills)
{
var capturedSkillCriterion = skillCriterion;
query = query.Where(fs => fs.son.Skills.Any(
skill => skill.SkillType == capturedSkillCriterion.SkillType &&
skill.Name == capturedSkillCriterion.Name));
}

var persons = from fs in query
group fs by fs.father into g
select new
{
Count = g.Count(),
Name = g.Key.Name
};

关于c# - Linq 多级动态 where 子句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10935618/

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