我有一个项目集合(ADO.NET实体框架),并需要返回一个子集作为搜索结果根据几个不同的标准。不幸的是,标准重叠的方式使得我不能仅仅采集Where
符合标准(或者落下Where
不符合标准),因为这会遗漏或重复应该返回的有效项目。IEnumerable <T> .Union(IEnumerable <T>)覆盖的内容而不是工会
我决定我会每个检查单独,并结合结果。我考虑使用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,a 1和a 3)。循环的第一次迭代按预期工作,结果仍为空。第二次迭代也按预期工作,结果包含两个项目。但是,在第三次迭代之后,结果只包含一个项目。
我刚刚误解了.Union
是如何工作的,还是有其他事情在这里发生?
可变名称应以小写字母开头,它使样本更易于阅读。 – Jodrell 2012-08-13 14:06:10
我相信在实体类中实现'IEqualityComparer'会很有意思,因为联合操作使用此接口。 –
2012-08-13 14:07:40
你可以发布你的测试数据吗? – 2012-08-13 14:08:05