3

私は2つのリストを持っています listA is a list ofMyClassAと listB ofMyClassB

MyClassAプロパティ付き:

  • ID
  • 名前

MyClassBプロパティ付き:

  • ID
  • 名前
  • アクティブ
  • MyClassAId

アイテムMyClassAは、1 つ以上のアイテム MyClassB を持つことができます

- MyClassA
    |
    | MyClassB
    | MyClassB
- MyClassA
    |
    | MyClassB
    | MyClassB
    | MyClassB
    | MyClassB

MyClassAアイテムの数が 1 より大きい場所のMyClassBリストactive = trueを取得したい

私はこのようなことを試しました:

listA.Where(b => listB.Any(a => a.MyClassAId == b.Id && a.Active == true));
4

2 に答える 2

3

Any> 0 になります。 > 1 の場合、次のようなことができます。

listA.Where(a => listB.Count(b => b.MyClassAId == a.Id && b.Active) > 1);

またはより良い短絡を使用して(ただし、おそらくLINQ-to-Objectsでは問題ありませんが、EFなどでは問題ありません):

listA.Where(
    a => listB.Where(b => b.MyClassAId == a.Id && b.Active).Skip(1).Any());

別のアプローチは、カウントを事前に計算することです。

var include = new HashSet<int>(listB.Where(b => b.Active)
                  .GroupBy(b => b.MyClassAId)
                  .Where(grp => grp.Count() > 1)
                  .Select(grp => grp.Key));

それで:

listA.Where(a => include.Contains(a.Id));
于 2012-11-22T07:19:21.087 に答える
0
var query = (from a in listA let count = listB.Count(b => b.Active && a.Id == b.MyClassAId) where count > 1 select a).ToList();
于 2012-11-22T07:29:19.797 に答える