0

List サブコレクションをプロパティとして含む List コレクションがあり、特定のプロパティの値に基づいてそのサブコレクション内の項目を除外したいと考えています。

簡単にするために、メイン コレクションを THING とサブコレクションを SUBTHING と呼びます。それらは異なるタイプです。THINGS には、1 つから複数の SUBTHINGS を含めることができます。SUBTHING には、フィルター処理する 2 つのプロパティがあり、PROP1 は 1 にする必要があり (1、2、3 にすることができます)、PROP2 は NULL にすることはできません (文字列を含めることができます)。

したがって、以下のようなクエリを使用すると、必要なものが得られるように見えます (ただし、All() が期待どおりに機能しているかどうかはわかりません)。

search = from c in search
where c.SUBTHING.All(s=>s.PROP1==1)
select c;

次に、他のプロパティを追加すると疑わしくなります。

search = from c in search
where c.SUBTHING.All(s=>s.PROP1==1 && s.PROP2 != NULL)
select c;

そして、PROP2 が Null である THINGS を取得します。

Any() に切り替えると、SUBTHING のすべてのフィルタリングが失われ、PROP1 = 1,2,3 である SUBTHINGS と、PROP2 が NULL であり NULL ではない SUBTHINGS が表示されます。

私が取得しようとしているのは、すべてのTHING IDをリストし、次にすべてのSUBTHINGSの名前をリストするコレクションです。次のようなものです:

THING.ID
     SUBTHING.Name
     SUBTHING.Name

THING.ID
     SUBTHING.Name
     SUBTHING.Name

THINGとSUBTHINGは2つの異なるタイプであるため、LINQでTHINGSをフィルタリングしながらSUBTHINGSもフィルタリングすることは可能ですか?

4

4 に答える 4

1

次のようなことを試してください:

search = 
    from c in search 
    where c.SUBTHING.All(s=>s.PROP1==1 && s.PROP2 != NULL) 
    select new {
         ThingId = c.ThingID,
         Something = c.SomeThing.Select(x=>x.Name)
     }; 

サブアイテムにフィルターを適用するには、次を試してください。

from product in products
where product.productid == 1
from image in product.productimages
where image.ismainimage
select image.imagename

送信元: 101 個の linq クエリ

于 2012-08-20T15:42:31.283 に答える
0

親エンティティ ( ) に対してクエリを実行しているため、プロジェクションが必要ですがTHING、結果セットにはそのサブセットのみが必要ですSUBTHINGS

たとえば、次の方法で実行できます。

class Thing
{
    Thing(Thing original, IEnumerable<Subthing> subthings)
    {
        // Initialize based on original and set the collection
        //
        ...
    }
}

次に、次のようにクエリを実行します。

var filtered = from c in search
               select new Thing(c, c.Subthings.Where(x => x.PROP1 == 1 && x.PROP2 != null))
于 2012-08-20T15:45:32.063 に答える
0

1 つの方法はEnumerable.Where、匿名型を使用することです。

var result = from thing in search
         from subthing in thing.subthings
         where subthing.prop1 == 1 && subthing.prop2 != null
         select new {ID = thing.ID, Name = subthing.Name};

foreach(var x in result)
{
    Console.WriteLine("ID={0} Name{1}", x.ID, x.Name);
}
于 2012-08-20T15:44:20.473 に答える