两组(列表)数据的交集

时间:2011-12-22 19:50:25

标签: c# linq entity-framework entity intersection

我有两组数据(复杂对象列表或SQL数据 - LINQ to Entities),我试图找到两组数据的交集。具体是Complex属性的交集,“HashData”如下所示:

SQL data

左边的集合可能大约是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);
    }

2 个答案:

答案 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));
}