7

left outer joinも含むクエリを作成しようとしていますcustom comparator

次のリストがあります。

List<ColumnInformation> list1;
List<ColumnInformation> list2;

これらは、SQL 列に関する情報 (データ型、名前、テーブルなど) を保持します。クラスをオーバーライドEqualsし、 と を作成しましoperator ==operator !=

左外部結合の作成方法を理解しています:

var leftOuterJoin = from l1 in list1
                    join l2 in list2 on l1.objectID equals l2.objectID into temp
                    from l2 in temp.DefaultIfEmpty(new { l1.ID, Name = default(string) })
                    select new
                    {
                        l1.ID,
                        ColumnName1 = l1.Name,
                        ColumnName2 = l2.Name,
                    };

そして、カスタムの作成方法と使用方法を理解していますIEqualityComparer:

public class ColumnComparer : IEqualityComparer<ColumnInformation>
{
    public bool Equals(ColumnInformation x, ColumnInformation y)
    {
        return x == y; //this uses my defined == operator
    }

    public int GetHashCode(ColumnInformation obj)
    {
        return 1; //forcing the join to use Equals, just trust me on this
    }
}

ColumnComparer cc = new ColumnComparer();
var joinedList = list1.Join(list2,
    x => x,
    y => y,
    (x, y) => new {x, y},
    cc);

私の質問は次のとおりです。左外部結合とコンパレーターの両方を同時に使用するにはどうすればよいですか?

私の知る限り、クエリ構文にはコンパレータのキーワードがなく、拡張メソッドにはキーワードの何もありませんinto

結果がクエリ構文であるか拡張メソッドであるかは気にしません。

4

2 に答える 2

5

その方法はGroupJoinandを使用することですSelectMany(結果を平坦化するため):

ColumnComparer cc = new ColumnComparer();
var joinedList = list1
    .GroupJoin(list2,
        x => x,
        y => y,
        (x, g) => new {x, g},
        cc)
    .SelectMany(
        z => z.g.DefaultIfEmpty(),
        (z, b) => new  { x = z.x, y = b } 
    );
于 2013-09-11T16:25:35.703 に答える