Entity Framework 4: Как кодировать проекцию на тип класса? - PullRequest
4 голосов
/ 24 октября 2010

Если у меня есть класс, подобный следующему:

public class Customer {
    public int    id    {get;set;}
    public string name  {get;set;}
    public string line1 {get;set;}
    public string line2 {get;set;}
    public string line3 {get;set;}
    public string line4 {get;set;}
}

И я хочу выбрать только значения идентификатора и имени, оставив остальные значения пустыми.

var myCustomerList = DC.Customer.Select( 
                     p => new Customer { id = p.id, name = p.name });

Я получаю следующую ошибку:

The entity or complex type 'MyModel.Customer' cannot
be constructed in a LINQ to Entities query.

Как еще ты это сделаешь? Обязательно ли указывать все поля класса?

Ответы [ 2 ]

2 голосов
/ 24 октября 2010

Попробуйте:

var myCustomerList = from c in DC.Customer 
                     select new { id = p.id, name = p.name };

Приведенное выше создаст анонимный тип .

Практическое применение:

"var myCustomerList" <-- Анонимный тип. </p>

Анонимный тип с двумя свойствами: «id» и «name».Кроме того, «var» позволяет вам создать неявно типизированную локальную переменную.Это означает:

a) Вам не нужно было объявлять / писать структуру класса для хранения типа только с этими двумя свойствами;

b) Вам не нужно поддерживать это либо- Вы можете изменить структуру вышеприведенного запроса, и «он просто работает».

0 голосов
/ 22 марта 2012

Другой вариант - создать тип CustomerInfo:

public class CustomerInfo
{
  public int Id { get; set;}
  public string Name { get; set; }
}

Вы не можете отобразить два типа непосредственно в одну и ту же таблицу в EF, но вы можете легко создать представление для своего типа информации, а затем отобразить его на:

CREATE VIEW vwCustomerInfo AS SELECT Id, Name FROM Customer

Затем вы сопоставляете свой тип CustomerInfo со своим видом:

public class CustomerInfoMap : EntityConfiguration<CustomerInfo>
{
  public CustomerInfoMap()
  {
    .ToTable("vwCustomerInfo");
  }
}

Побочным эффектом этого является то, что EF будет извлекать только столбцы в представлении при запросе вашей базы данных. При получении CustomerInfo по идентификатору вы получите SQL, подобный этому:

SELECT Id, Имя ОТ vwCustomers, ГДЕ id = 1

Кроме того, если ваше представление обновляется, вы можете обновлять тип CustomerInfo из EF, и базовая таблица будет обновляться.

...