use*_*324 6 c# linq entity entity-framework intersection
我有两组数据(复杂对象列表或SQL数据 - LINQ to Entities),我试图找到两组数据的交集.具体是Complex属性的交集,"HashData"如下所示:
左侧的集合可能约为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)
由于您使用的是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)
归档时间: |
|
查看次数: |
6264 次 |
最近记录: |