0

おそらく誰かがこの(少なくとも私にとっては)複雑な問題を手伝ってくれるでしょう。

私が次のデータを持っているとしましょう(DBに)

Tab1 (id_t1): Item
  (1)
  (2)
  (3)

Tab2 (id_t2, id_t1): Group
  (4, 1)
  (5, 1)
  (6, 2)
  (7, 3)

Tab3 (id_t3, id_t2, v): GroupField
  (10, 4, 100) 
  (11, 4, 300)
  (12, 5, 200)
  (13, 6, 100)
  (14, 6, 200)  
  (15, 7, 100)
  (16, 7, 300)

ここで、特定のGroupFieldをすべて含むすべてのアイテムを選択したいと思います。

例えば。私はv=list(100,200)を持っています

そして私は1、2を取り戻すのが好きですが、3は取り戻しません

Group4はv=100のField10を保持し、Group5はv=200のField12を保持するため1

Group6はv=100のField13とv=200のField14を保持しているため2

Linqでこのようなことが可能ですか?(私はすでにさまざまな方法(いずれか/すべて)を試しましたが、これまでのところ成功していません。

「フィールドはどのグループにも存在でき、すべてが1つのグループに存在するわけではない」ということを克服する方法がわかりません...

temp-tables / cursorを使用せずに、SQLで1つのコマンドでこれを行う方法すらわかりません。

_レネ

4

1 に答える 1

2

これを試して:

var result =
    groups.Join(fields, o => o.Id, i => i.GroupId,
                (o, i) => new { Group = o, Field = i } )
          .GroupBy(x => x.Group.ItemId)
          .Where(x => values.All(y => x.Any(z => z.Field.Value == y)))
          .Select(x => x.Key)
          .Distinct();

次のクラスが使用されます。

class Group
{
    public Group(int id, int itemId)
    {
        Id = id;
        ItemId = itemId;
    }

    public int Id { get; set; }
    public int ItemId { get; set; }
}

class GroupField
{
    public GroupField(int id, int groupId, int value)
    {
        Id = id;
        GroupId = groupId;
        Value = value;
    }

    public int Id { get; set; }
    public int GroupId { get; set; }
    public int Value { get; set; }
}

および次の初期化:

var groups = new [] { new Group(4, 1), new Group(5, 1),
                      new Group(6, 2), new Group(7, 3) };

var fields = new [] { new GroupField(10, 4, 100),
                      new GroupField(11, 4, 300), 
                      new GroupField(12, 5, 200),  
                      new GroupField(13, 6, 100),  
                      new GroupField(14, 6, 200),  
                      new GroupField(15, 7, 100),  
                      new GroupField(16, 7, 300)
                    };

var values = new [] { 100, 200 };
于 2012-12-12T18:12:59.887 に答える