2011-12-21 45 views
1

我將盡力描述這是我能做到的最好方式。我能想到的最好辦法就是給你一個數據集。Linq到SQL查詢組雖然仍然選擇細節

動物
ID類型
1獅子
2個老虎
3只熊

AnimalDetails
ID AnimalId身高體重
1 162英寸200磅
2 156英寸150磅
3 1 23英寸125lbs
個 4 247英寸500lbs
5 288英寸150磅
6 215英寸125lbs

如果有幫助,假裝這些表已經加入

也許有一個FK其他一些包含每種動物類型詳細數據的表格;身高,身高,年齡等

我想按動物類型(獅子等)進行分組,並選擇它,但也選擇獅子的細節。

所以我想要鑰匙是獅子,那麼也許是獅子信息的集合。

這有道理嗎?

我的企圖顯然難道不工作,但在這裏它是無論如何:

var animals = (from a in Animals 
       group a by new { AnimalType = a.Type } 
       into grouped 
       select grouped); 

UPDATE 添加了僞表結構。林沒有尋找這個1的答案,因爲這顯然是假的數據,只是尋找如何實現這一目標的方向。

+0

Lion的細節與Tiger的細節相同嗎?意思是他們都需要像「身高」,「體重」等相同的屬性....或者他們會不同你的類型之間? – 2011-12-21 18:31:58

+0

爲了這個問題假裝他們是一樣的 – 2011-12-21 18:43:56

回答

2

我會讀這個SO文章:Linq with Left Join on SubQuery containing Count

通過對動物做你的正常組,然後在AnimalId加入到詳細信息表,以獲得詳細的只是一次屬性。

編輯:

 var query = (from d in details 
        join a in 
         (from animal in animals 
         group animal by animal.Name into g 
         select new { Name = g.Key }) on d.Name equals a.Name 
        select new { a.Name, d.Height, d.Weight }).ToList(); 

上面的查詢假設你已經不加入僞數據表。如果他們已經加入,那麼我不明白你爲什麼要按動物名稱分組,然後獲取詳細信息,因爲您的示例中的詳細信息每個動物出現一次以上。 (1頭獅子有多個詳細記錄)。

+0

對不起,我打算在AnimalDetails表中顯示可能有很多不同的老虎,獅子等 – 2011-12-21 18:51:09

+1

所以要澄清,這兩個單獨的表在現實中? =)無論哪種方式,我認爲創造性地使用子查詢可以解決您的問題。採取每個部分,並自己寫一個查詢,然後開始將它們組合成一個語句。這與我經常使用SQL的方法是一樣的。將一個結果集縮小到一個臨時集合中,然後創建另一個臨時集合,然後您可以開始將它們組合起來以獲得所需內容。 – ryan1234 2011-12-21 18:56:44

0

你在使用group by的時候丟失了id值。如果失去id值,則不能在動物和動物詳細信息之間使用foreinKey。所以你不使用group by這個代碼你可以得到animalDetails。

var listAnimals = new List<Animals> 
         { 
          new Animals {Id = 1, Name = "Lions"}, 
          new Animals {Id = 2, Name = "Tigers"}, 
          new Animals {Id = 3, Name = "Bears"} 
         }; 

    var listAnimalDetails = new List<AnimalDetails> 
           { 
            new AnimalDetails {Id = 1, AnimalId = 1, Height = 62, Weight = 200}, 
            new AnimalDetails {Id = 2, AnimalId = 1, Height = 56, Weight = 150}, 
            new AnimalDetails {Id = 3, AnimalId = 1, Height = 23, Weight = 125}, 
            new AnimalDetails {Id = 4, AnimalId = 2, Height = 47, Weight = 500}, 
            new AnimalDetails {Id = 5, AnimalId = 2, Height = 88, Weight = 150}, 
            new AnimalDetails {Id = 6, AnimalId = 2, Height = 15, Weight = 125} 
           }; 


    var join = (from anm in listAnimals 
        join anmD in listAnimalDetails 
        on anm.Id equals anmD.AnimalId 
        select new 
        { 
         Animal = anm.Name, 
         H = anmD.Height, 
         W = anmD.Weight 
        }).ToList(); 

此後您可以使用group by上的連接。我希望你能幫忙。