实体框架加载子集合

时间:2011-05-11 19:31:43

标签: asp.net entity-framework

我正在尝试使用以下代码填充PersonRight对象中的Rights对象:

var results = (from P in this.ObjectContext.Person
                join R in this.ObjectContext.Rights
                 on R.personid = p.personid
                select new PersonRight(){
                               Name = P.Name,
                           }).AsQueryable();



public class PersonRight
{
    public property Person { get; set; }
    public List<Rights> Rights { get; set; }
}

我想用这个查询填充Rights对象,怎么做呢?我不能使用实体框架创建的实体,所以我需要将这些数据库对象填充到自定义类型中。

谢谢

3 个答案:

答案 0 :(得分:1)

你可以试试这个:

var results = (from P in this.ObjectContext.Person
               join R in this.ObjectContext.Rights
               on P.personid equals R.personid
               into PR
               select new PersonRight()
               {
                   Name = P.Name,
                   Rights = PR
               }).AsQueryable();

public class PersonRight
{
    public string Name { get; set; }
    public IEnumerable<Rights> Rights { get; set; }
}

需要注意的一些事项:

  • 必须在LINQ equals中使用join,而不是==
  • equals 的左侧必须为外部变量,因此on R.personid equals P.personid错误。
  • 您必须使用into关键字为特定人员创建一组所有权利。变量PR表示该人的所有权利的IEnumerable。
  • 如果Rights课程中的PersonRightList<Rights>,我不知道如何使其有效。在LINQ to Entities中无法使用PR.ToList(),因为它会抱怨它无法将ToList()转换为商店表达式。
  • 这一切都假设您的Person类没有直接指向权限的导航属性(如Person.Rights)。如果您拥有它,则应在查询中使用它,不要使用join

答案 1 :(得分:0)

var results = (from P in this.ObjectContext.Person                 
                select new PersonRight()
                           {Person = P,
                            Rights = p.Rights.ToList() }).ToList(); 

OR

var results = (from P in this.ObjectContext.Person                 
                select new PersonRight()
                           {Person = P,
                            Rights = this.ObjectContext.Rights.Where(r=>r.personid == p.personid ).ToList() }).ToList(); 

答案 2 :(得分:0)

一种可能的解决方案(可能不是很有效?)是简单地获取Persons列表并在创建每个PersonRights对象时获得相应的Rights

var results = 
    (from P in this.ObjectContext.Person
     select new PersonRight 
     {
        Name = P.Name,
        Rights = (from R in this.ObjectContext.Rights where R.personid == P.personid select R).ToList()
     }).AsQueryable();