2011-04-17 54 views
0

所以我最近開始檢查ASP.NET MVC3和EFCodeFirst並且陷入了困境。 我有2種型號: 人:從連接表中獲取計數 - EFCodeFirst

[Bind(Exclude = "PersonID")] 
    public class Person { 

     public int PersonID { get; set; } 

     [Required(ErrorMessage="Given name is a required field")] 
     [DisplayName("Given name")] 
     public string GivenName { get; set; } 

     [Required(ErrorMessage="Family name is a required field")] 
     [DisplayName("family name")] 
     public string FamilyName { get; set; } 

     [Required(ErrorMessage = "Birthdate is a required field")] 
     [DisplayFormat(DataFormatString = "{0:d}")] 
     public DateTime Birthdate { get; set; } 

     [DisplayName("Ingredient")] 
     public virtual Ingredient Ingredient { get; set; } 
} 

和配料:

public class Ingredient { 
    public int IngredientID { get; set; } 

    [Required(ErrorMessage = "Ingredient is a required field")] 
    public string Name { get; set; } 

    public virtual ICollection<Person> Persons { get; set; } 
} 

現在問題是,成分是半固定表(僅企業用戶可以添加的成分,但是這是一個不同的故事),並且一個人可以輸入他/她的數據和他/她最喜歡的成分。 這一切都正常,但我想通過加入2個表格,然後按順序,計數和限制(以10爲例)創建一個前10個成分。

這裏的問題是,我已經嘗試了幾件事情,只是不能得到它的工作。我對LINQ相當陌生,無法理解如何做到這一點。

任何建議將不勝感激!

編輯: 要指定一次,我只需要下面的查詢在LINQ相當於:

SELECT i.name, COUNT(p.Ingredient_IngredientID) AS Total 
FROM People p, Ingredients i 
WHERE p.Ingredient_IngredientID = i.IngredientID 
GROUP BY i.name 
ORDER BY total DESC; 

回答

3

你應該標記public Ingredient IngredientID { get; set; }虛擬,這樣的成分表延遲加載。你也應該把它稱爲配料,因爲它不僅僅是ID,它是一個被引用的實際成分。

如果我正確理解你,你想弄清楚哪種成分是最受歡迎的?如果是這樣,只需按照Ingredient.IredredID將人員分組並計算每個分組中的人員數量。

做的另一種方式是一個

public virtual ICollection<Person> Persons { get; set;}字段添加到配料類,現在你可以做

var tenMostPopularIngredients = (from i in Ingredients 
          orderby i.Persons.Count() descending 
          select i).Take(10); 

這爲您提供了每種成分的名稱爲鍵和計數作爲字典值,按數量降序排列。如果你得到一個ArgumentException的,那是因爲你有多個同名的成分:

var tenMostPopularIngredients = (from i in ingredients 
           let count = i.Persons.Count() 
           orderby count descending 
           select new 
           { 
            Ingredient = i, 
            Count = count 
           } 
           ).Take(10).ToDictionary(t => t.Ingredient.Name,t => t.Count); 
+0

+1我沒有注意到他沒有說明從Ingredient到Person的導航。 – Euphoric 2011-04-17 16:58:38

+0

正是我想要的,謝謝! – Fverswijver 2011-04-17 17:39:10

+0

說得太快,顯然它*有點*的作品,但只是給了我一份重複每一種成分的清單。即: - 番茄 - 沙拉 - 蘋果 - 番茄 – Fverswijver 2011-04-18 19:52:11