【发布时间】:2012-08-13 14:02:54
【问题描述】:
我有一组项目(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 的工作原理,还是这里发生了其他事情?
【问题讨论】:
-
变量名应该以小写字母开头,这样更容易阅读示例。
-
我相信在你的实体类中实现
IEqualityComparer<T>会很有趣,因为联合操作使用了这个接口。 -
你能发布你的测试数据吗?
标签: c# ienumerable