2012-03-19 1 views
0

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

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

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(); 

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

+1

я задаюсь вопросом, если имя «Entity» является правильным выбором при использовании Entity Framework! ! подумайте о рефакторе по названию, если это возможно. Кроме того, вам было бы гораздо лучше использовать выделенную модель просмотра для этой цели. –

+0

@jim tollan - Спасибо, это замечательный момент, я бы не очень много думал и переименую его. – GrandMasterFlush

+0

lemme знает, если это решает проблему;) –

ответ

1

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

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

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

+0

Спасибо за вашу помощь (и терпение!) Герт. – GrandMasterFlush

1

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

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

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();