两组(列表)数据的交集

use*_*324 6 c# linq entity entity-framework intersection

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

SQL数据

左侧的集合可能约为10000行,而右侧的集合总是约100行的子集.我意识到,如果我在存储它时将"Hashdata"左侧的集合排序,使用某种二进制搜索算法进行搜索会快得多,但是由于与问题无关的原因我无法做到这一点.

较小的数据子集永远不会存储在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) {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上我想要做的是:

返回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);
    }
Run Code Online (Sandbox Code Playgroud)

Jos*_*osh 6

由于您使用的是IEnumerable,因此可以使用Intersect Extension方法而不是Join.如果要返回大集合,则需要将大集合查询的结果与较小集合相交.你需要编写一个IEquality Comparer,如下所示:http: //msdn.microsoft.com/en-us/library/bb355408.aspx来比较你的对象,然后调用Intersect扩展方法:

return bStrs.Intersect(aObj, new MyEqualityComparer());
Run Code Online (Sandbox Code Playgroud)