0

可能有人可以帮助我解决这个(至少对我而言)复杂的问题。

可以说我有以下数据(在数据库中)

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)

现在我想选择包含所有某些特定 GroupFields 的所有项目。

例如。我有 v = list(100,200)

我喜欢找回 1,2 但不是 3

1 因为 Group4 持有 Field10 且 v=100 而 Group5 持有 Field12 且 v=200

和 2 因为 Group6 拥有 Field13 的 v=100 和 Field14 的 v=200

在 Linq 中是否有可能发生这样的事情?(我已经尝试过不同的方式(任何/全部),但到目前为止没有成功。

我不明白如何克服“字段可以在任何组中,而不是全部在一个组中”...

我什至不知道如何在不使用临时表/游标的情况下在一个命令中在 SQL 中执行此操作。

_rene

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 回答