2016-04-14 29 views
5

Pierwszy post tutaj i całkiem prosty.Zachowanie projekcji Entity Framework

Szukałem upraszczania niektórych złożonych zapytań w aplikacji, którą właśnie opracowuję, i podsuwam sobie nieco głowę poniżej.

więc powiedzieć, że te dwie klasy:

Podmiot domena „EmailRecipient” (stosowany z EF kodowej pierwszy więc spodziewać się tabela SQL być generowane z tymi samymi nazwami kolumn).

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; } 
} 

i prosta klasa dla JSON serializacji nazwie "EmailLite" zdefiniowano jako

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

W moim specjalistycznej EF6 (.1.3) DbContext, mam DbSet nazywa EmailRecipients.

Więc naturalnie wykonanie tego wyrażenia linq przeciwko EmailRecipients

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

wygenerowany SQL jest

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

Więc dlaczego kiedy zrobić:

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

EmailRecipients.Select(projectionFunction); 

mogę dostać poniżej (pełna Wygenerowany przez 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] 

Każda pomoc będzie najbardziej doceniana!

Cheers, Sat

Odpowiedz

3

IQueryable<T>.Select() trwa Expression<Func<T,TOut>> jako parametr, funkcja jest rzeczywiście używany jest IEnumerable<T>.Select() która odbywa delegata. Z tego powodu mówisz EF, że od tego momentu używasz IEnumerable zamiast IQueryable, a reszta zapytania zostanie wykonana w pamięci => pobierasz wszystkie kolumny.

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

Wszystko, co musisz zrobić, to zmiana projectionFunction do wyrażenia i będzie działać:

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

Dziękuję - To musiała być prosta: Musiałem ponownie spojrzeć juuuuust trochę bliżej :) wiwaty Alexander. – sat1986