2

このようなクエリを実装する必要があります。C#のLinq2Sqlステートメントでは、次のように記述できます。

var query = from f1 in Foo
            from f2 in Foo
            where f1.Id < f2.Id && f1.Value == f2.Value
            select f1;

しかし、C#式を使用してこれを行う方法は疑問です。私はこのようなものを意味します:

var query = Foo.Join(...).Select(...);

Joinメソッドはequaljoinのみを使用する機会を与えることがわかりますf1.Id == f2.Id。しかし、C#式でより複雑なクエリ式を記述する方法。たとえば、?などの式はどこにありf1.Id < f2.Idますか?

4

3 に答える 3

1

元のクエリは結合を使用していないため、直接変換はありません...しかし、これで近づく可能性があると思います:

var query = Foo.Join(Foo, 
                     f1 => f1.Value, 
                     f2 => f2.Value, 
                     (f1, f2) => new { f1, f2 })
               .Where(g => g.f1.Id < g.f2.Id)
               .Select(g => g.f1);
于 2011-01-19T19:26:54.140 に答える
1

他の 回答でも同じ結果が得られますが、元のクエリ構文と意味的に同じには変換されません。

意味的に元のクエリ構文に近いものが必要な場合は、SelectMany拡張メソッドを使用します。これは、複数のfrom句がある場合にクエリ構文が変換されるものであるためです。

var query = Foo.
    // from f1 in Foo
    // from f2 in Foo 
    //
    // Need the anonymous type to carry over the two items
    // in the sequences, the compiler will do the same
    // in your original query, although the names
    // will be much more mangled.
    SelectMany(f => Foo, (f1, f2) => new { f1, f2 }).

    // f1.Id < f2.Id && f1.Value == f2.Value 
    Where(f => f.f1.Id < f.f2.Id && f.f1.Value == f.f2.Value).

    // select f1;
    Select(f => f.f1);

Joinまた、メソッドを使用することはできますが、等価性に基づく内部結合セマンティクスが必要な状況でのみ使用できることに注意してください。SelectManyそれ以外のものは、 への呼び出しで使用する必要がありますWhere

于 2011-01-19T19:37:26.773 に答える
0

クエリを再配置すると、シンプルで読みやすい式の構文に固執できる場合があります。プロパティに参加して.Valueでフィルタリングするのはf1.Id < f2.Idどうですか?これにより、探している結果が得られるはずです。

var query = from f1 in Foo
            join f2 in Foo on f1.Value equals f2.Value
            where f1.Id < f2.Id
            select f1;
于 2011-01-19T19:41:39.907 に答える