2011-12-22 23 views
6

私は2つのデータセットの交差を見つけるために2つのデータセット(複雑なオブジェクトまたはSQLデータのリスト - LINQ to Entities)を持っています。下図のように複雑なプロパティの具体交差点、「HashData」:データの2つのセット(リスト)の交差

SQL data

右のセットは常に約100のサブセットでありながら、左のセットは、およそ10000行である可能性が高いです行。私はそれを格納するときに "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) { 
     } 
    } 
} 

しようとして何イム

HashData(小さなセットから)がShowDataでは見つかりますが、DBへのLINQ to Entityの初期クエリではShowDataオブジェクト(大きなセット)のリストを返します。

私はと親しま:

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

答えて

6

あなたがIEnumerableをを使用しているので、あなたが交差する拡張メソッドを使用する代わりに参加することができます。大きなセットを返す場合は、大きなセットのクエリの結果と小さなセットを交差させたいと思うでしょう。あなたはここに示されているようIEquality比較子を記述する必要があります:http://msdn.microsoft.com/en-us/library/bb355408.aspxあなたのオブジェクトを比較するために、そして交差の拡張メソッドを呼び出します。

return bStrs.Intersect(aObj, new MyEqualityComparer()); 
+0

こんにちはジョシュ私はこれを試みました: 'public bool Equals(ShowData x、ShowData y) { //比較されたオブジェクトが同じデータを参照しているかどうかを確認します。 if(Object.ReferenceEquals(x、y))がtrueを返します。 //比較対象のオブジェクトがnullかどうかを確認します。 if(Object.ReferenceEquals(x、null)|| Object.ReferenceEquals(y、null)) falseを返します。 //商品のプロパティが等しいかどうかを確認します。 return x.HashData == y.HashData; } ' – user1112324

+0

しかし、これがどのようにコンパイルされているのか分かりません.iEnumerable にはIntersectの定義がありません – user1112324

+0

@ user1112324 - 'System.Linq'と ' System.Collections.Generic '? Intersectは、確かにIEnumerable の拡張メソッドです。 –

1

このような何かがうまくいくかもしれない(未テストの警告):

private IEnumerable<ShowData> xyz(List<ShowData> aObj, List<ShowData> bObj) 
{ 
    return aObj.Where(sd1 => bObj.Select(sd2 => sd2.HashData).Contains(sd1.HashData)); 
} 
+0

こんにちは、私は上記を試したが、私は2つのセットを反復し、私は上記のメソッドを実行すると対戦記録(records.HashData == actual.HashData)をカウントするための別の結果を得る:IEnumerable には= xyz(ShowData、 recordingPoints); intが返されます。カウント(); – user1112324

+0

あなたのメソッドは一意の値を取得するだけです(つまり、返されたセットにすでに存在する場合は読み込まれません)。 – user1112324

+0

ジョシュの答えは、あなたの目的のためにはもっとうまくいくはずです(ただし、インターセクトだけが明確な結果を提供するかどうかはわかりませんが)。 –

関連する問題