2012-12-12 136 views
0

可能有人可以帮助我(至少对我来说)复杂的问题。Linq子选择过滤器

可以说我有如下数据(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) 

现在,我想选择所有项目,包括所有的一些具体GroupFields的。

例如,我有V =列表(100,200)

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

1,因为组4保持字段10用v = 100,组5保持Field12用v = 200

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

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

我不明白如何克服,“领域可以在任何组,并不是所有在一个组”...

我甚至不知道如何在一个命令,而无需使用临时,表/光标为此在SQL

_rene

+0

我不明白的逻辑。第14场是第4组还是第7组还是第8组,你的样本结果会是什么? –

+0

如果field14是第4组(item1),结果将只有1,因为第6组不会包含字段200. –

+0

但:... 我知道它在SQL中工作。非常简单....我可能在我走得更远之前采取一些睡眠:) 从Tab1中选择不同的id_t1 t1 在t1.id_t1上加入Tab2 t2 = t2.id_t1 在t2.id_t2 = t2上加入Tab3 t3。 id_t3 group by id_t1,v v中有(100,200) –

回答

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 }; 
+0

+1三层嵌套Where/All/Any lambda!这就是男女分开的原因。 :-) –

+0

嘿Daniel感谢您的回答。刚刚发现,我的SQL毕竟不是真正正确的。你的代码不会产生它应该的结果。它返回1和2,但1不好,因为group4或5都不包含值100.所以我基本尝试做的事情:获取至少包含那些有100和200值的字段的所有项目。但是这些领域可以在不同的小组中,甚至不在一个小组中。 –

+0

@renemarxis:我的代码符合你的规范,我引用:“我想回1,2”,此外你说:“1,因为Group4持有Field10 v = 100,Group5持有Field12 v = 200”。项目1需要返回,因为它具有值100和200,100通过组4 - >区域10和200通过组5 - >区域12.为什么说组4不包含值100我不知道。 –