我有两组数据(复杂对象列表或SQL数据 - LINQ to Entities),我试图找到两组数据的交集。具体是Complex属性的交集,“HashData”如下所示:
左边的集合可能大约是10000行,而右边的集合总是大约100行的子集。我意识到,如果我在存储它时将“Hashdata”左侧的集合排序,使用某种二进制搜索算法进行搜索会快得多,但是由于与问题无关的原因我无法做到这一点。 / p>
较小的数据子集永远不会存储在SQL中(出于解释目的,仅在下面的SQL表中显示)。它在运行时以List<ShowData>
显示。
目前我正在对数据进行可怜的循环并进行匹配(其中recording
是100行列表而ShowData
是10000行列表):
List<ShowData> ShowData = (from showData in context.ShowDatas
where (showData.Show.Id == advert.Id)
orderby showData.HashData ascending
select showData).ToList();
foreach (ShowData recording in recordingPoints) {
foreach (ShowData actual in ShowData) {
if (recording.HashData == actual.HashData) {
}
}
}
基本上我试图做的是:
返回一个ShowData对象列表(大集合),其中在LINQ to Entity初始查询中向ShowData BUT中找到任何HashData(来自小集合)。
我接近:
private IEnumerable<ShowData> xyz(List<ShowData> aObj, List<ShowData> bObj)
{
IEnumerable<string> bStrs = bObj.Select(b => b.HashData).Distinct();
return aObj.Join(bStrs, a => a.HashData, b => b, (a, b) => a);
}
答案 0 :(得分:6)
由于您使用的是IEnumerable,因此可以使用Intersect Extension方法而不是Join。如果要返回大集合,则需要将大集合查询的结果与较小集合相交。你需要编写一个IEquality Comparer,如下所示:http://msdn.microsoft.com/en-us/library/bb355408.aspx来比较你的对象,然后调用Intersect扩展方法:
return bStrs.Intersect(aObj, new MyEqualityComparer());
答案 1 :(得分:1)
这样的事可能有用(警告未经测试):
private IEnumerable<ShowData> xyz(List<ShowData> aObj, List<ShowData> bObj)
{
return aObj.Where(sd1 => bObj.Select(sd2 => sd2.HashData).Contains(sd1.HashData));
}