Asp.net mvc 3 EF如何反转对象层次结构
我有一个家庭中的用户列表Asp.net mvc 3 EF如何反转对象层次结构,asp.net-mvc-3,entity-framework,Asp.net Mvc 3,Entity Framework,我有一个家庭中的用户列表var foo=someUser.MyFamily() 每个用户都有一个类列表公共虚拟列表类{get;set;} 每个类都有一个日期列表公共虚拟列表日期{get;set;} 要显示家庭本周的节目,我想创建一个表 date class people... class people... date+ class people 最终能够说 foreach (var d in foo) { use d.Date
var foo=someUser.MyFamily()代码>
每个用户都有一个类列表公共虚拟列表类{get;set;}
每个类都有一个日期列表公共虚拟列表日期{get;set;}
要显示家庭本周的节目,我想创建一个表
date class people...
class people...
date+ class people
最终能够说
foreach (var d in foo)
{
use d.Date
foreach (var c in d.Classes)
{
use c.Class.ClassTime, c.Class.ClassName
foreach (var u in c.Users)
{
use u.FirstName
谢谢你的洞察力 我明白了强>
多亏了这篇文章,我学会了如何使用SelectMany扁平化层次结构
一旦我将其展平,就可以直接使用GroupBy()
从日期->会议->用户重建对象层次结构,从而
每个日期都有一个会议列表
每个会议都有一个用户列表
var meetingDates = Model.User.MyFamily(true)
.SelectMany(x => x.ClassesIamIn)
.SelectMany(x => x.Class.ClassMeetings, (c, d) => new { Date = d.Date, Meeting = d, c.User })
.GroupBy(x => x.Date)
.Select(x => new
{
Date = x.Key,
Meetings = x.Select(y => new { Meeting = y.Meeting, User = y.User })
.GroupBy(a => a.Meeting)
.Select(a => new
{
Meeting = a.Key,
Users = a.Select(b => b.User)
.OrderBy(d => d.FirstName)
})
.OrderBy(c => c.Meeting.TimeStart.TimeOfDay)
});
哇,这是一场斗争;哇,真是松了一口气。上述文章是关键。我已经知道如何使用SelectMany()在列表内部进行钻取。我不知道的是愚蠢的lambda语法,用于创建一个包含父对象的对象(parent,child)=>新的{parent-child-mix}
Eric如果有多对多(用户族除外),你可以有这种类型的“思考”——近似于一对多(模型)。如果你有m-2-m,那么最简单的方法就是修改你的实体模型,以使关系朝相反的方向发展。然后,您可以使用“本机”linq查询,而无需任何努力。如果您可以更改model@NSGaga我明白你的意思,事实上,在目前的模式下这是可能的。ClassTime->Class->UsersInClass可以工作,但它给了我一个包含所有用户的所有类的所有会议的巨大结果集。不知何故,我不得不加入到家庭成员名单中。我想不出该怎么做。无论如何,从家庭成员开始加入似乎会更快。
var meetingDates = Model.User.MyFamily(true)
.SelectMany(x => x.ClassesIamIn)
.SelectMany(x => x.Class.ClassMeetings, (c, d) => new { Date = d.Date, Meeting = d, c.User })
.GroupBy(x => x.Date)
.Select(x => new
{
Date = x.Key,
Meetings = x.Select(y => new { Meeting = y.Meeting, User = y.User })
.GroupBy(a => a.Meeting)
.Select(a => new
{
Meeting = a.Key,
Users = a.Select(b => b.User)
.OrderBy(d => d.FirstName)
})
.OrderBy(c => c.Meeting.TimeStart.TimeOfDay)
});