我有一组项目(ADO.NET 实体框架),需要根据几个不同的条件返回一个子集作为搜索结果。不幸的是,标准以这样的方式重叠,以至于我不能只获取Where
满足条件的集合(或删除Where
不满足条件),因为这会遗漏或重复应该返回的有效项目。
我决定单独进行每项检查,并结合结果。我考虑过使用AddRange
,但这会导致结果列表中出现重复(我的理解是它每次都会枚举集合 - 我在这里是正确/错误吗?)。我意识到Union
不插入重复项,并将枚举推迟到必要时(再次,这种理解是否正确?)。
搜索写法如下:
IEnumerable<MyClass> Results = Enumerable.Empty<MyClass>();
IEnumerable<MyClass> Potential = db.MyClasses.Where(x => x.Y); //Precondition
int parsed_key;
//For each searchable value
foreach(var selected in SelectedValues1)
{
IEnumerable<MyClass> matched = Potential.Where(x => x.Value1 == selected);
Results = Results.Union(matched); //This is where the problem is
}
//Ellipsed....
foreach(var selected in SelectedValuesN) //Happens to be integer
{
if(!int.TryParse(selected, out parsed_id))
continue;
IEnumerable<MyClass> matched = Potential.Where(x => x.ValueN == parsed_id);
Results = Results.Union(matched); //This is where the problem is
}
然而,这似乎Results = Results.Union(matched)
更像是Results = matched
. 我已经完成了一些测试数据和测试搜索。搜索要求第一个字段为 -1、0、1 或 3 的结果。这应该返回 4 个结果(两个 0,一个 1 和一个 3)。循环的第一次迭代按预期工作,结果仍然为空。第二次迭代也按预期工作,结果包含两个项目。然而,在第三次迭代之后,Results 只包含一项。
我只是误解了它.Union
的工作原理,还是这里发生了其他事情?