2015-04-02 82 views
-1

我有屬性,它可以通過一個多被應用到許多ID來許多國旗行連接表:LINQ的選擇與所有包括標誌和沒有排除標誌

ID | Flag 
--------- 
1 | C 
2 | B 
3 | B 
3 | C 
4 | A 
5 | A 
5 | C 
6 | A 
6 | B 
7 | A 
7 | B 
7 | C 

這轉動到:

1 C 
2 B 
3 BC 
4 A 
5 A C 
6 AB 
7 ABC 

給定2個標誌數組,Include和Exclude我想查找所有包含所有Include標誌並且沒有排除標誌的ID。

包括= [A,B],排除= [C]:結果ID = [6]

包括= [A],排除= [C]:結果ID = [4,6]

包括= [A],排除= []:結果ID = [4,5,6,7]

我想要在Linq中,理想情況下這應該使用查詢語法。

我試過創建這個,但無法克服如何開始治療多項與一組標準。

from row in data 
where 
    include.Contains(row.Flag) && 
    !exclude.Contains(row.Flag) 
select row.ID 
+4

我看到幾個'我想''而且沒有任何事與'我試過'有關。 – Jonesopolis 2015-04-02 13:29:03

+0

您的意思是說包括,排除?我不明白你的意思......;(你是否想把兩個參數傳遞給linq查詢:包括A,B &&排除D然後ID = 6? – 2015-04-02 13:33:01

+0

@Jonesy我非常簡單的linq掉在它的臉上,即包含任何並排除一切,並嘗試通過它在SQL中通常有幫助,但無法讓我的頭繞它 – 2015-04-02 13:36:43

回答

3
Dictionary<int, string> flags = new Dictionary<int, string> { /* ... */ }; 
string[] includes = ["A", "B"]; 
string[] excludes = ["C"]; 
flags 
    .GroupBy(f => f.Id) 
    .Where(g => 
     includes.All(i => g.Any(f => f.Flag == i)) && 
     !excludes.Any(e => g.Any(f => f.Flag == e))) 
+1

這是票,https://dotnetfiddle.net/BXXQRU – 2015-04-02 14:18:08

2

你需要按ID,然後檢查是否每個組包含所有Include標誌和沒有Exclude的國家:

var q = Items.GroupBy(x => x.ID) 
      .Where(g => (g.Select(x => x.Flag) 
          .Intersect(Include) 
          .Count() == Include.Count()) 

         &&       
         (g.Select(x => x.Flag) 
          .Intersect(Exclude) 
          .Count() == 0)) 
      .Select(g => g.Key); 

我使用Intersect檢查存在/不各組內存在Include/Exclude標誌。

鑑於你的樣本數據,如:

string[] Include = new string[] { "A", "B" }; 
string[] Exclude = new string[] { "C" }; 

輸出是:在上述LINQ查詢中使用

[0] = 6 

Items對象是List的:

class Item 
{ 
    public int ID {get; set;} 
    public string Flag { get; set; } 
} 
+1

也可以https://dotnetfiddle.net/ ZstMV8,但pluc的是第一,更短。 – 2015-04-02 14:24:12