从连接表中获取计数-EFCodeFirst

问题描述

| 因此,我最近开始检查ASP.NET MVC3和EFCodeFirst,并陷入困境。 我有2个型号: 人:
    [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”标记为虚拟,这样就可以延迟加载配料表。另外,您应该仅将其称为“成分”,因为它不仅是ID,而且是被引用的实际成分。 如果我正确理解您的意思,您想弄清楚哪种成分最受欢迎?如果是这样,只需按Ingredient.IngredientID将人员分组,然后计算每个分组中的人员数量。 另一种方法是添加一个 将“ 4”字段转到“成分”类,现在您可以
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);
    ,将OrderBy和Take结合起来还不够吗?