Хотя other answers даст тот же результат, он не преобразуется в том же семантически в исходный синтаксис запроса.
Если вы хотите, чтобы что-то семантически было ближе к исходному синтаксису запроса, вы должны использовать метод расширения 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
.