0

首先要做的事情 - 我使用Visual Studio 2012中的C#連接到SqlServerCe數據庫。 我正在使用Entity framework 6和Linq執行此功能。 所以 - 關於這個問題。按照一組返回所有內容,但只返回其他組的所有內容

我有一個表如下

ItemGroup 
(
    ID INT PRIMARY KEY, 
    ItemID INT, 
    GroupID INT 
) 

有鏈接到這個在項目組通過表它們的ID(項目和組)和兩個外鍵列兩個表。

每個項目可以是一個組的一部分,每個組可以有很多項目。

如果項目具有0則組ID它被認爲不屬於某一組

的一部分的這樣的結果是,有每個具有2約3000基 - >〜30項,但有一個小組有大約4000個項目。

我的問題是我有一個項目列表,我想只返回一個來自每個組,除非該項目是組0的一部分(即沒有組)。在組0的情況下,我想返回所有匹配的項目。

例如:

**Group 0** 

*Item 1, 
Item 2, 
Item 3,* 

**Group 1** 

*Item 4, 
Item 5* 

**Group 2** 

*Item 6, 
Item 7, 
Item 8* 

**Group 3** 

*Item 9* 

,我有以下的產品清單。

*Item1, Item2, Item4, Item5, Item6, Item7* 

在這種情況下,我想輸出的所有從我的名單是在組0,這樣的項目:

*Item1, Item2* 

項目4是組1的一部分,所以我們要顯示該項目,但由於項目5是同一組的一部分,所以我們不希望這樣,所以我的名單的其餘部分將顯示如下:

*Item4, Item6* 

給予的完整列表:

*Item1, Item2, Item4, Item6* 

我嘗試了好幾種方法,主要是通過使用一個聯盟,由此我首先獲得組0中的所有記錄,然後在其他記錄上首先進行組合,然後將它們結合在一起以獲得最終結果。

但是,這看起來效率非常低,需要一個年齡來執行 - 更不用說Linq聲明很難遵循。

有人能指出我可能遵循的方向以執行此功能嗎?

+0

你能發表嗎?涉及表的模式? – BillRuhl 2014-11-06 15:11:30

回答

0

此代碼將爲您提供非零組的結果。同樣,你可以找出另一組。我希望這有幫助。

var query1 = from t in context.Table1 
        where t.GroupID != 0 
        group t by t.GroupID into g 
        select new 
        { 
         ID = g.Key, 
         Groups = g.Take(1) 
        }; 


     Console.WriteLine("items with non 0 group"); 
     foreach (var item in query1) 
     { 

      foreach (var g in item.Groups) 
      { 
       Console.WriteLine(" ID " + g.ID + " " + "Group ID " + g.GroupID + " " + " Item ID " + g.ItemID);  
      } 



     } 

輸入數據

ID ItemID GroupID 

1 1  0 
2 2  0 
3 3  0 
4 4  1 
5 5  1 
6 6  2 
7 7  2 
8 8  2 

產生

items with non 0 group 

ID 4 Group ID 1 Item ID 4 
ID 6 Group ID 2 Item ID 6 
1

你想用SelectMany(),有條件地返回取決於所述組ID的分組的序列的全部或僅一個輸出:

var result = (from item in data 
      group item by item.Group) 
      .SelectMany(group => group.Key == 0 ? group : group.Take(1));