LINQ проекция на модель презентации - PullRequest
2 голосов
/ 27 января 2010

Я довольно новичок в LINQ и многих современных технологиях проектирования приложений, управляемых данными, так что это может быть довольно простой вопрос.

Я пытаюсь создать проекцию пары разных сущностей Entity Framework на простую модель представления. Допустим, у меня есть entites Parent (свойства: ID, Name, Age) и Child (свойства: ID, Name, Age со ссылкой на Parent) Я хочу проецировать их на PresentationParent и PresentationChild, где все свойства одинаковы, но PresentationParent имеет список. Как бы я сделал это в LINQ?

from p in entities.Parent
select new PresentationParent
{
    ID = p.ID,
    Name = p.Name,
    Age = p.Age,
    Children = [[?? What goes here ??]]
}

Это на правильном пути вообще? Я могу только найти примеры простых, плоских проекций.

Ответы [ 2 ]

4 голосов
/ 27 января 2010

Примерно так:

from p in entities.Parent
select new PresentationParent {
    ID = p.ID,
    Name = p.Name,
    Age = p.Age,
    Children = (from c in entities.Child
                where c.Parent == p
                select new PresentationChild {
                    ID = c.ID,
                    Name = c.Name,
                    Age = c.Age
                }).ToList()
}

Однако ваши сущности должны быть предварительно настроены с необходимыми связями внешних ключей, чтобы вы могли сделать что-то вроде этого:

from p in entities.Parent
select new PresentationParent {
    ID = p.ID,
    Name = p.Name,
    Age = p.Age,
    Children = p.Children.ToList()
}

Конечно, это вернуло бы все свойства каждого дочернего элемента, так что вы можете все равно спроецировать дочерние элементы:

from p in entities.Parent
select new PresentationParent {
    ID = p.ID,
    Name = p.Name,
    Age = p.Age,
    Children = (from c in p.Children
                select new PresentationChild {
                    ID = c.ID,
                    Name = c.Name,
                    Age = c.Age
                }).ToList()
}
0 голосов
/ 27 января 2010

Другая альтернатива, если связь не настроена достаточно, чтобы иметь доступный доступ:

from p in entities.Parent
from c in entities.Children on p.ID equals c.parentID into children
select new PresentationParent
{
    ID = p.ID,
    Name = p.Name,
    Age = p.Age,
    Children = children.ToList()
}
...