EF: проецирование данных в подкласс класса - PullRequest
0 голосов
/ 19 марта 2012

Я пытаюсь спроецировать некоторые данные в список POCO, где POCO содержит экземпляр POCO другого типа.

Два класса - это Case и MyEntity, где Case имеет экземпляр MyEntity, называемыйКлиент.

public class Case
{
    public int ID { get; set; }
    public string CaseReference { get; set; }
    public bool Deleted { get; set; }
    public MyEntity Client { get; set; }
}

и

public class MyEntity
{
    public int ID { get; set; }
    public string Name { get; set; }
}

Я пытаюсь запросить его следующим образом, но не получаю сообщение «Невозможно создать постоянное значение типа MyEntity»:

 var result = (from c in context.cases
               where c.case_ref.Contains(caseReference)
               select new Case
               {                                      
                   ID = c.id,
                   CaseReference = c.case_ref,
                   Deleted = c.deleted,
                   Client = new MyEntity { ID = c.client.id, Name = c.client.name } 
               }).ToList();

Какой лучший способ сделать это, мне придется разбить его на отдельные запросы?

Ответы [ 2 ]

1 голос
/ 19 марта 2012

Исходя из ответа Герта, я решил опубликовать ответ в синтаксисе выражения запроса для всех, у кого есть эта проблема.

Обратите внимание, что мне пришлось добавить немного проверки, чтобы обработать отсутствие данныхв таблице клиента:

var result = (from c2 in ((from c1 in context.cases
                           where c1.case_ref.Contains(caseReference)
                           select c1).ToList())
              select new Case
              {
                  ID = c2.id,
                  CaseReference = c2.case_ref,
                  Deleted = c2.deleted,
                  Client = (c2.client_id != null ? new MyEntity { ID = c2.client.ID, Name = c2.client.name } : null)
              }).ToList();
1 голос
/ 19 марта 2012

Реализация IQueryable в Entity Framework более требовательна к созданию новых объектов в объектах, чем обычная привязка к объектам (IEnumerable). Если вы сначала преобразуете результат запроса в IEnumerable с помощью ToList ():

context.cases.Where(c => c.case_ref.Contains(caseReference).ToList()

Затем вы можете продолжить создание new Case объектов так, как вы хотите. (Возможно, вам потребуется Include() Case.Client в context.cases).

...