2009-09-01 3 views
4

にString.Containsに参加組み合わせ左の列には右の列に文字列の値が入ります。は、私は左を作成するには、次のLINQクエリは、2つのテーブル間の結合をしているLINQクエリ

  var joinResultRows = from leftTable in dataSet.Tables[leftTableName].AsEnumerable() 
          join 
            rightTable in dataSet.Tables[rightTableName].AsEnumerable() 
            on leftTable.Field<string>(leftComparedColumnName).Contains(rightTable.Field<string>(rightComparedColumnName)) equals true 
             into leftJoinedResult 
          select new { leftTable, leftJoinedResult }; 

が、それは参加の左側には認識されないrightTable原因は動作しません:

は、私はこれを試してみました。

String.Containsの結果となる結合を作成するにはどうすればいいですか? 'where'句または 'On'句に含まれていますか?

答えて

2

私は左の表は、すべてのレコードを保持し、一致しない場合、右がnull保持している(参加)SelectManyを作成することによって、それを解決:

var joinResultRows = from leftDataRow in dataSet.Tables[leftTableName].AsEnumerable() 
          from rightDataRow in dataSet.Tables[rightTableName].AsEnumerable() 
          .Where(rightRow => 
           { 
            // Dont include "" string in the Contains, because "" is always contained 
            // in any string.           
            if (String.IsNullOrEmpty(rightRow.Field<string>(rightComparedColumnName))) 
             return false; 

            return leftDataRow.Field<string>(leftComparedColumnName).Contains(rightRow.Field<string>(rightComparedColumnName)); 

           }).DefaultIfEmpty() // Makes the right table nulls row or the match row 
           select new { leftDataRow, rightDataRow }; 

は先端をありがとう:)

5

SelectManyを試しましたか?

var result = 
from left in dataSet.Tables[leftTableName].AsEnumerable() 
from right in dataSet.Tables[rightTableName].AsEnumerable() 
where left.Field<string>(leftComparedColumnName).Contains(right.Field<string>(rightComparedColumnName)) 
select new { left, right }; 

編集:

所望の効果を持っている必要があり、次の

class ContainsEqualityComparer: IEqualityComparer<string> 
{ 
    public bool Equals(string right, string left) { return left.Contains(right); } 
    public int GetHashCode(string obj) { return 0; } 
} 

var result = 
    dataSet.Tables[leftTableName].AsEnumerable().GroupJoin(
     dataSet.Tables[rightTableName].AsEnumerable(), 
     left => left, 
     right => right, 
     (left, leftJoinedResult) => new { left = left, leftJoinedResult = leftJoinedResult }, 
     new ContainsEqualityComparer()); 

キーの比較では、カスタムされたIEqualityComparerを介して実行されます。 leftとrightのGetHashCode()が同じ場合にのみ2つの行が結合され、Equalsはtrueを返します。

希望します。

+0

+1 SelectManyの場合 - LINQはキー均等性によってシーケンス内の要素をペアにする "等結合"のみをサポートします。 – dahlbyk

+0

selectManyは私が考えなかった何か、ありがとう。 一致を見つけましたが、私の問題は解決しません。 LEFT JOINは新しい結合テーブルを作成するか、少なくとも2つのテーブルを持つ匿名型を作成する必要があります(左のものと上記の例のようなもの)。上記のクエリを実行した後、leftTable、leftJoinedResultの両方を使用して結果テーブルを手動で作成しました。 SelectManyを左に参加させることはできますか? – Rodniko

+0

私はLinQと匿名のタイプで何をしようとしているのかを実際に達成する方法はないと思います。しかし、いくつかの回避策があります。私は上記の投稿であなたのために努力していきます。 –

関連する問題