Entity Framework, загружающий подколлекцию - PullRequest
2 голосов
/ 11 мая 2011

Я пытаюсь заполнить объект Rights в моем объекте PersonRight, используя следующий код:

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; }
}

Я бы хотел заполнить объект Права этим запросом, как это можно сделать? Я не могу использовать сущность, созданную сущностью, поэтому мне нужно заполнить эти объекты базы данных пользовательским типом.

Спасибо

Ответы [ 3 ]

1 голос
/ 12 мая 2011

Вы можете попробовать это:

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; }
}

Несколько замечаний:

  • Вы должны использовать equals в LINQ join ине ==.
  • В левой части equals должна быть внешней переменной, поэтому on R.personid equals P.personid неверен.
  • Вы должны использовать into ключевое слово для создания группы всех прав для конкретного человека.Переменная PR представляет собой IEnumerable всех прав человека.
  • Я не знаю, как заставить это работать, если Rights в вашем PersonRight классе - List<Rights>.Использование PR.ToList() невозможно в LINQ to Entities, потому что он будет жаловаться, что не может преобразовать ToList() в выражение хранилища.
  • Все это предполагает, что у вас нет свойства навигации в вашем классе Person, которыйуказывает прямо на права (как Person.Rights).Если он у вас есть, вы должны использовать его в своем запросе и не использовать join.
0 голосов
/ 11 мая 2011

Одним из возможных решений (может быть, не очень эффективным?) Является получение списка 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();
0 голосов
/ 11 мая 2011
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(); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...