2012-12-12 135 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我不知道。 –