3

2 番目のコレクション B (1 から n) に対応するキーを持たないコレクション A からすべてのアイテムを取得する、または B に要素が存在する場合は、MyValue を持つアイテムのみを取得するための効率的な LINQ クエリが必要です (可能であればメソッド構文で)。ヌル。つまり、B に存在しない A のすべての要素を返すか、少なくとも 1 つの行が MyValue = null である B に存在する場合に返します。

table A
{
  int MyKey (primary_key);
}

table B
{ 
  int MyKey (foreign_key to A.MyKey);
  string MyValue;
}

私は Except() を試していましたが、これは両方のコレクションが同じ型の場合にのみ機能します。GroupJoin() を試していましたが、参加後に重複を削除する方法が見つかりませんでした。

a.GroupJoin(
 b.Where(item => item.Value = null), 
 el => el.MyKey, 
 el2 => el2.MyKey,
 (el3, el4) => el3); 

これで、もう存在しないために再度結合された B のアイテムを除外します。

純粋なSQLでは、達成するのは非常に簡単です:

select * from A a left join B b on a.MyKey = b.MyKey where MyValue is null;
4

2 に答える 2

2

まあ、それは LINQ 構文ではるかにきれいです:

var result = (
    from a in aCollection
    join b in bCollection on a.Key equals b.AKey into bSubCollection
    where !bSubCollection.Any(x => x.Value != null)
    select a
);

ただし、ここではメソッド構文にもあります。

var result = aCollection
    .GroupJoin(bCollection, a => a.Key, b => b.AKey, (a, bSub) => new { a, bSub })
    .Where(c => !c.bSub.Any(x => x.Value != null))
    .Select(c => c.a);

a基本的に、と のコレクションを使用して匿名型にグループ参加し、null 以外の sがあるかどうかによって(はすでに区別されます)bのコレクションをフィルタリングするだけです。cabValue

于 2013-09-13T13:04:25.280 に答える
0

メソッド構文を変換する必要がありますが、記述した左外部結合のクエリ構文は次のようになります。

 var query = from itemA in a
        join itemB in b on
            itemA.MyKey equals itemB.MyKey into joinTable
        from itemB in joinTable.DefaultIfEmpty()
        where (itemB == null) || (itemB.MyValue == null)
        select itemA;

結果に個別を適用する必要があります。次の投稿を見ることができます: Distinct by property of class by linq

または、MoreLinqで DistinctBy を使用します

于 2013-09-13T13:03:44.230 に答える