如何解决从连接表中获取计数-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结合起来还不够吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。