2016-04-14 4 views
5

Первое сообщение здесь и довольно простое.Поведение проекции структуры Entity Framework

Я изучал упрощение некоторых сложных запросов в приложении, которое я разрабатываю, и я немного почесываю голову ниже.

Так что у меня есть эти два класса:

Доменное объект «EmailRecipient» (используется с EF-код первого поэтому ожидать таблицы SQL, которые будут созданы с теми же именами столбцов).

public class EmailRecipient 
{ 
    public Guid Id { get; set; } 
    public string FriendlyName { get; set; } 
    public string ExchangeName { get; set; } 
    public string Surname { get; set; } 
    public string Forename { get; set; } 
    public string EmailAddress { get; set; } 
    public string JobTitle { get; set; } 

    public virtual List<SentEmail> SentEmails { get; set; } 
} 

и простой класс для сериализации JSON под названием "EmailLite" определяется как

public class EmailLite 
{ 
    public string EmailAddress { get; set; } 
    public Guid Id { get; set; } 
    public string FriendlyName { get; set; } 
} 

В моем специализированном EF6 (.1.3) DbContext, у меня есть DbSet называется EmailRecipients.

Поэтому, естественно, выполняя это выражение Linq против EmailRecipients

EmailRecipients.Select(x => new EmailLite 
     { 
      Id = x.Id, 
      EmailAddress = x.EmailAddress, 
      FriendlyName = x.FriendlyName 
     }); 

сгенерированный SQL является

SELECT 
    1 AS [C1], 
    [Extent1].[Id] AS [Id], 
    [Extent1].[EmailAddress] AS [EmailAddress], 
    [Extent1].[FriendlyName] AS [FriendlyName] 
    FROM [dbo].[EmailRecipients] AS [Extent1] 

Так почему, когда я делаю:

Func<EmailRecipient, EmailLite> projectionFunction = x => new EmailLite 
     { 
      Id = x.Id, 
      EmailAddress = x.EmailAddress, 
      FriendlyName = x.FriendlyName 
     }; 

EmailRecipients.Select(projectionFunction); 

я получаю ниже (полный) Сгенерировано SQL:

SELECT 
    [Extent1].[Id] AS [Id], 
    [Extent1].[FriendlyName] AS [FriendlyName], 
    [Extent1].[ExchangeName] AS [ExchangeName], 
    [Extent1].[Surname] AS [Surname], 
    [Extent1].[Forename] AS [Forename], 
    [Extent1].[EmailAddress] AS [EmailAddress], 
    [Extent1].[JobTitle] AS [JobTitle], 
    [Extent1].[SubscribedOn] AS [SubscribedOn] 
    FROM [dbo].[EmailRecipients] AS [Extent1] 

Любая помощь была бы очень признательна!

Приветствия, сб

ответ

3

IQueryable<T>.Select() принимает Expression<Func<T,TOut>> в качестве параметра, функция на самом деле вы используете IEnumerable<T>.Select(), который принимает делегат. Из-за этого вы сообщаете EF, что с этого момента вы используете IEnumerable, а не IQueryable, а остальная часть запроса будет выполнена в памяти => вы извлекаете все столбцы.

EmailRecipients <-- in memory from here on --> .Select(projectionFunction); 

Все, что вам нужно сделать, это изменить projectionFunction в выражение, и он будет работать:

Expression<Func<EmailRecipient, EmailLite>> projectionFunction = x => new EmailLite 
{ 
    Id = x.Id, 
    EmailAddress = x.EmailAddress, 
    FriendlyName = x.FriendlyName 
}; 
+0

Спасибо - Это должно было быть просто: мне нужно, чтобы выглядеть juuuuust немного ближе :) ура снова Александр. – sat1986

Смежные вопросы