2009-11-13 58 views
0

我有一个名为ASB的表和一个名为PeopleInvolved的表。有一个名为PeopleInvolved_ASB的联结表,它只包含一个ASBID和一个PeopleInvolvedID列。这些列充当复合主键。实体框架 - 多对多问题

设计师不显示交接表(如预期的那样)。我想根据ASBID检索PeopleInvolved列表。

要检索的人,我这样做:

// This top line gets the ASB record from the Case 
var asbRecord = (from c in dd.Case 
         where c.CaseID == caseID 
         select c.ASB).First(); 

     var asbID = asbRecord.Select(asb => asb.ASBID).First(); 

     var people = (from asb in dd.ASB 
         where asb.ASBID == asbID 
         select asb.PeopleInvolved); 

现在,我想要做的就是添加每个PeopleInvolved记录类型PeopleInvolved的简单列表。我不能这样做。我不断收到:

错误4无法将类型“System.Data.Objects.DataClasses.EntityCollection”到“Dynamic.PeopleInvolved”

我怎样才能得到PeopleInvolved的简单列表到一个通用的清单,我可以传回我的控制器?

谢谢,

回答

1

这就是你想要做的?

List<PeopleInvolved> genericPeopleInvolvedList = (from asb in dd.ASB 
          where asb.ASBID == asbID 
          select asb.PeopleInvolved).ToList(); 

[更新时间:回答坏之前]

刚刚意识到asb.PeopleInvolved是集不是单一的实体(该死!)。因此,之前的linq查询正在返回PeopleInvolved实体的CollectionS。既然你是ASPID选择应该只有一个fullfill asb.ASBID where子句asb.ASBID == asbID,你可以做如下:

var listWithCollectionOfPeopleInvolved = (from asb in dd.ASB 
           where asb.ASBID == asbID 
           select asb.PeopleInvolved).ToList(); 

List<PeopleInvolved> peopleInvolved = listWithCollectionOfPeopleInvolved.First().ToList(); 

但它的,如果你用它做包含好得多:

var asbInstance = (from asb in dd.ASB.Include("PeopleInvolved") 
         where asb.ASBID == asbID 
         select asb).FirstOrDefault(); 
foreach(PeopleInvolved pi in asbInstance.PeopleInvolved) 
{ 
//do your stuff 
} 

With Include自动加载相关属性。

+0

这就是我做的,可是后来当我尝试在foreach: 的foreach(在人PeopleInvolved人) {// 做一些 } 我得到上面提到的转换错误。 – Paul

1

根据您报告的错误我猜PeopleInvolved是一个集合。所以,试试这个:

var people = (from asb in dd.ASB 
        where asb.ASBID == asbID 
        from pi in asb.PeopleInvolved 
        select pi).ToList(); 

我认为这是非常混淆有两个命名PeopleInvolved一个类型,该类型具有完全相同的名称的集合。类似地,看起来你有一个叫做ASB的类型和一个实体集,其中包含许多同名的实例,

使实体集名称复数和类型名称单数更清晰。

如果我猜错了类型,请说明ASBDynamic.PeopleInvolveed的布局。

0
List<PeopleInvolved> = new List<PeopleInvolved>(people);