2

いくつかの項目を取得するための既存の LINQ クエリがあります。

var result = from foo in x.SomeThings
             from bar in x.OtherThings
             where foo.RefId == bar.RefId
             select foo;

x は、次の 3 つのプロパティを含むオブジェクトです。

  1. List<MyThing> SomeThings
  2. List<MyThing> OtherThings
  3. List<MyStuff> MyStuffsMyThing でもあるプロパティが含まれています。

クラスの概要は次のとおりです。

public class X
{
    public List<MyThing> SomeThings;
    public List<MyThing> OtherThings;
    public List<MyStuff> MyStuffs;
}

public class MyThing
{
    public int RefId;
}

public class MyStuff
{
    public MyThing TheThing;
    public DateTime WhenHappened;
}

一致する RefId 値に基づいて、WhenHappened の最も古い値に基づいて、返された foo で並べ替えるにはどうすればよいですか?

4

1 に答える 1

3

したがって、Eric Lippertが述べたように、完全なデカルト積(コードサンプルの最終結果)を実行するのではJoinなく、ここで演算子を使用できます。これにより、パフォーマンスが大幅に向上します。SelectMany

次に、値で並べ替えるには、最初の2つだけでなく、3つのリストすべてに参加する必要があるようです。3つのシーケンスすべてに参加すると、順序付けは非常に簡単になります。

var query = from first in x.SomeThings
            join second in x.OtherThings
            on first.RefId equals second.RefId

            join third in x.MyStuffs
            on first.RefId equals third.TheThing.RefId

            orderby third.WhenHappened
            select first;

このクエリの結果は、のWhenHappenedプロパティによって順序付けられた3つのシーケンスすべてにあるアイテムを返すことですMyStuffs

于 2013-03-05T19:55:53.867 に答える