首先让我说我已经在这里搜索并阅读了很多关于动态 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 子句。一个父亲对象有一个儿子对象的集合,而儿子对象又具有一个技能对象的集合。如查询所示,我想知道每个父亲的姓名以及他们拥有一定技能的儿子的数量。这组技能将在运行时选择,因此即使在示例中,我们只有两组技能(2 个 where 子句),它可以是 10 个或运行时任意数量的子句。
我认为我最大的问题是我似乎无法根据我的情况调整 StackOverflow 上给出的答案示例,因为我需要从顶层(父亲)获取信息以及来自第 3 层的信息(技能) 与第 2 级(儿子)的信息有关。
如果需要,我将在明天发布我已经尝试过的示例代码。我现在做不到,因为我有点着急。任何帮助将不胜感激。
编辑:
我需要的是一种在运行时连接 where 子句的方法,具体取决于用户选择了多少过滤条件。不同的过滤条件是从外部来源获得并在运行时构建的。例如:
在场景一中,可能有 3 个标准,例如用户选择的标准 1、标准 2 和标准 3。场景 2 可能有 5 个标准,例如标准 1、标准 2、...、标准 5。第三种情况可能有 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
};
场景二:
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
};