-1

異なるタイプの 2 つのコレクションがあります。

// First Collection
public class ObjectA
{
   public IEnumerable<SomeObject> Persons { get; set; }
   public IEnumerable<SomeOtherObject> Items { get; set; }
}

public class SomeObject
{
   public string ID { get; set; }
}
public class SomeOtherObject
{
   public string ID { get; set; }
}

// Second Collection (ID property holds unique values, PersonID and EntityID do not)
public class ObjectB
{
    public string ID { get; set; }
    public string PersonID { get; set; }
    public string EntityID{ get; set; }
}

// Assuming the following entries...
var list1 = new ObjectA();
var persons = new List<SomeObject>();
persons.Add(new SomeObject() { ID = "A" });
persons.Add(new SomeObject() { ID = "B" });
persons.Add(new SomeObject() { ID = "C" });
list1.Persons = persons;

var items = new List<SomeOtherObject>();
items.Add(new SomeOtherObject() { ID = "1" });
items.Add(new SomeOtherObject() { ID = "2" });
list1.Items = items;

var list2 = new List<ObjectB>();
list2.Add(new ObjectB() { ID = "1", PersonID = "C", EntityID = "1" });
list2.Add(new ObjectB() { ID = "2", PersonID = "A", EntityID = "1" });
list2.Add(new ObjectB() { ID = "3", PersonID = "A", EntityID = "2" });
list2.Add(new ObjectB() { ID = "4", PersonID = "B", EntityID = "1" });
list2.Add(new ObjectB() { ID = "5", PersonID = "B", EntityID = "2" });

これら 2 つのリスト (list1 と list2) が与えられます。PersonID = A AND B AND EntityID = 1 AND 2 のリスト 2 のアイテムを見つける方法

つまり、すべての条件が満たされている必要があるため、「人物 C」は EntityID = 「1」と「2」の両方ではなく「1」のみを持っているため、「人物 C」は成功しません。

4

6 に答える 6

1

このようなものを使用できます

list2.Where(b => list1.Persons.Exists(person => person.ID == b.PersonID) &&
                 list1.Items.TrueForAll(id => list2.Exists(bs => bs.EntityID == id.ID && bs.PersonID == b.PersonID)))

これにより、list2 から 4 つのアイテムが得られます (必要に応じて、一意の人物を取得できます)。

于 2012-12-19T10:42:02.807 に答える
1

質問を正しく読んだ場合、このクエリは、list1.Items にリストされているすべての EntityIds を含むすべての個人 ID を提供します (1 と 2 をハードコーディングするのではなく)

var validIds = list1.Items.Select(i => i.ID);
var validPersonIds = list2.GroupBy(p => p.PersonID)
                          .Where(g => validIds.All(i => g.Any(x => x.EntityID == i)))
                          .Select(g => g.Key);

更新: あなたのコメントから、これが必要だと思います。ID が 2、3、4、および 5 の list2 からオブジェクトを返します。

var validEntityIds = list1.Items.Select(i => i.ID);
var validPersonIds = list1.Persons.Select(i => i.ID);
var validObjects = list2.GroupBy(p => p.PersonID)
                        .Where(g => validPersonIds.Contains(g.Key) &&
                                    validEntityIds.All(i => g.Any(x => x.EntityID == i)))
                        .SelectMany(g => g);
于 2012-12-19T10:59:19.497 に答える
0
var query = list2.GroupBy(item => item.PersonID)
                 .Where(g => g.Any(item => item.EntityID == "1") &&
                             g.Any(item => item.EntityID == "2"))
                 .SelectMany(g => g);

PersonIDCが 1 と 2 の EntityID を持つアイテムがないため、最初のアイテムを除くすべてのアイテムを返します。

于 2012-12-19T10:56:21.103 に答える
0

これを試してください: これにより、必要な組み合わせが得られます。

        var listSelected = (from val2 in list2
                            where val2.PersonID == "A" || val2.PersonID == "B"
                            && val2.EntityID == "1" || val2.EntityID == "2"
                            select val2).ToList();
于 2012-12-19T10:42:08.007 に答える
0

多分これはあなたが望むものを生成します:

  var result1 = list2.Where(row=> row.EntityID=="1").Select(r=>r.PersonID);
  var result2 = list2.Where(row => row.EntityID == "2").Select(r => r.PersonID);
  var finalResult = result1.Intersect(result2);
于 2012-12-19T10:43:55.313 に答える
0

次のようなことを試すことができます。

list2.Where(p => p.EntityID == "1" || p.EntityID == "2")
    .GroupBy(p => p.PersonID)
    .Where(grp => grp.Count() == 2);

list2これにより、指定されたエンティティ 1 と 2 を持つ各人物が返されます。サンプルデータの「A」と「B」です。

編集:

Azhar へのコメントに基づいて、以下はより一般的です。

var entityFilter = new string[]{"1", "2"};

list2.Where(p => entityFilter.Contains(p.EntityID))
    .GroupBy(p => p.PersonID)
    .Where(grp => grp.Count() == entityFilter.Count());
于 2012-12-19T10:50:02.197 に答える