2016-04-14 14 views
5

Bài đăng đầu tiên ở đây và một bài đăng đơn giản.Hành vi chiếu Khung thực thể

Tôi đã xem xét đơn giản hóa một số truy vấn phức tạp trong một ứng dụng tôi đang phát triển và tôi đang gãi đầu một chút ở bên dưới.

Vì vậy, nói tôi có hai loại cổ phiếu này:

Một thực thể miền "EmailRecipient" (sử dụng với EF mã đầu tiên để mong đợi một bảng SQL được tạo ra với những cái tên cùng một cột).

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

và một lớp đơn giản cho JSON serialization gọi là "EmailLite" định nghĩa là

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

Trong EF6 chuyên ngành của tôi (.1.3) DbContext, tôi có một DbSet gọi EmailRecipients.

Vì vậy, một cách tự nhiên thực hiện biểu LINQ này chống lại EmailRecipients

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

SQL được tạo ra là

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

Vậy tại sao khi tôi làm:

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

EmailRecipients.Select(projectionFunction); 

làm tôi nhận được bên dưới (hoàn thành) SQL được tạo:

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] 

Mọi trợ giúp sẽ được đánh giá cao nhất!

Chúc mừng, Sat

Trả lời

3

IQueryable<T>.Select() mất một Expression<Func<T,TOut>> như tham số, hàm bạn đang thực sự sử dụng là IEnumerable<T>.Select() mà phải mất một đại biểu. Bởi vì điều này, bạn đang nói với EF rằng từ thời điểm đó, bạn đang sử dụng IEnumerable thay vì IQueryable và phần còn lại của truy vấn sẽ được thực hiện trong bộ nhớ => bạn đang tìm nạp tất cả các cột.

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

Tất cả bạn cần làm là thay đổi projectionFunction vào một biểu thức và nó sẽ làm việc:

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

Cảm ơn bạn - Nó có phải đơn giản: tôi cần phải nhìn juuuuust một chút gần gũi hơn :) cổ vũ một lần nữa Alexander. – sat1986

Các vấn đề liên quan