当我只想要一个返回时,EntityFramework 4返回所有列

时间:2012-08-27 17:33:29

标签: entity-framework entity-framework-4 ef-code-first

我无法弄清楚为什么entityframework会在以下两个查询中返回所有列。我试图让它只返回日期列,但是当我查看生成的sql(发布在下面)时,返回db.EmailDetails的所有列

var y = (from data1 in db.EmailDetails
                             join data2 in db.AddressBookEntries on data1.FromAddressBookEntryId equals data2.Id
                             orderby data1.EmailSendFinishTime descending 
                             select data1.EmailSendFinishTime).FirstOrDefault();


var x =
                        db.EmailDetails.Where(a => a.User.Username == username && a.FromAddressBookEntry.WhiteList).
                            Select(a => new
                                            {
                                                a.EmailSendFinishTime
                                            }).
                            OrderByDescending(
                                a => a.EmailSendFinishTime)
                            .FirstOrDefault();

生成的SQL:

            exec sp_executesql N'SELECT TOP (1) 
            [Project1].[Id] AS [Id], 
            [Project1].[UserId] AS [UserId], 
            [Project1].[InValidMailMessage] AS [InValidMailMessage], 
            [Project1].[MailInternalDate] AS [MailInternalDate], 
            [Project1].[MessageUniqueId] AS [MessageUniqueId], 
            [Project1].[FromAddressBookEntryId] AS [FromAddressBookEntryId], 
            [Project1].[ToEmailAddress] AS [ToEmailAddress], 
            [Project1].[EmailFolderId] AS [EmailFolderId], 
            [Project1].[EmailHeaderInfo] AS [EmailHeaderInfo], 
            [Project1].[EmailSendSmtpServer] AS [EmailSendSmtpServer], 
            [Project1].[EmailSendStatus] AS [EmailSendStatus], 
            [Project1].[EmailSendStartTime] AS [EmailSendStartTime], 
            [Project1].[EmailSendFinishTime] AS [EmailSendFinishTime], 
            [Project1].[EmailSendLogMessage] AS [EmailSendLogMessage], 
            [Project1].[Subject] AS [Subject], 
            [Project1].[MimeMessageFull] AS [MimeMessageFull], 
            [Project1].[HighPriority] AS [HighPriority], 
            [Project1].[SentDateTime] AS [SentDateTime], 
            [Project1].[EmailDeleted] AS [EmailDeleted], 
            [Project1].[EmailDeletedDateTime] AS [EmailDeletedDateTime], 
            [Project1].[EmailViewed] AS [EmailViewed], 
            [Project1].[EmailViewedDateTime] AS [EmailViewedDateTime], 
            [Project1].[BodyTextForSend] AS [BodyTextForSend], 
            [Project1].[ReceivedDate] AS [ReceivedDate]
            FROM ( SELECT [Extent1].[Id] AS [Id],
                          [Extent1].[UserId] AS [UserId],
                          [Extent1].[InValidMailMessage] AS [InValidMailMessage],
                          [Extent1].[MailInternalDate] AS [MailInternalDate],
                          [Extent1].[MessageUniqueId] AS [MessageUniqueId],
                          [Extent1].[FromAddressBookEntryId] AS [FromAddressBookEntryId],
                          [Extent1].[ToEmailAddress] AS [ToEmailAddress],
                          [Extent1].[EmailFolderId] AS [EmailFolderId],
                          [Extent1].[EmailHeaderInfo] AS [EmailHeaderInfo],
                          [Extent1].[EmailSendSmtpServer] AS [EmailSendSmtpServer],
                          [Extent1].[EmailSendStatus] AS [EmailSendStatus],
                          [Extent1].[EmailSendStartTime] AS [EmailSendStartTime],
                          [Extent1].[EmailSendFinishTime] AS [EmailSendFinishTime],
                          [Extent1].[EmailSendLogMessage] AS [EmailSendLogMessage],
                          [Extent1].[Subject] AS [Subject],
                          [Extent1].[MimeMessageFull] AS [MimeMessageFull],
                          [Extent1].[HighPriority] AS [HighPriority],
                          [Extent1].[SentDateTime] AS [SentDateTime],
                          [Extent1].[EmailDeleted] AS [EmailDeleted],
                          [Extent1].[EmailDeletedDateTime] AS [EmailDeletedDateTime],
                          [Extent1].[EmailViewed] AS [EmailViewed],
                          [Extent1].[EmailViewedDateTime] AS [EmailViewedDateTime],
                          [Extent1].[BodyTextForSend] AS [BodyTextForSend],
                          [Extent1].[ReceivedDate] AS [ReceivedDate]
                   FROM [dbo].[EmailDetails] AS [Extent1]
                        INNER JOIN [dbo].[Users] AS [Extent2] ON [Extent1].[UserId] =
                        [Extent2].[Id]
                        INNER JOIN [dbo].[AddressBookEntries] AS [Extent3] ON
                        [Extent1].[FromAddressBookEntryId] = [Extent3].[Id]
                   WHERE ([Extent2].[Username] = @p__linq__0) AND
                         ([Extent3].[WhiteList] = 1))  AS [Project1]
            ORDER BY [Project1].[EmailSendFinishTime] DESC',N'@p__linq__0 nvarchar(4000)
            ',@p__linq__0=N'ekellner9

EmailDetail定义和AddressBookEntry定义

        public class EmailDetail
        {
            public EmailDetail()
            {
                // keep sqlserver from blowing up with no datetime set
                EmailSendStartTime = new DateTime(1900, 1, 1);
                EmailSendFinishTime = new DateTime(1900, 1, 1);
            }
            [Key]
            [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
            public long Id { get; set; }

            [ForeignKey("User")]
            public long UserId { get; set; }

            [Required(ErrorMessage = "Must have user associted with EmailDetail")]
            public User User { get; set; }


            public long? FromAddressBookEntryId { get; set; }
            public AddressBookEntry FromAddressBookEntry { get; set; }

            public DateTime EmailSendStartTime { get; set; }
            public DateTime EmailSendFinishTime { get; set; }  
        }
        public class AddressBookEntry
        {
            [Key]
            [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
            public long Id { get; set; }

            [ForeignKey("User")]
            public long UserId { get; set; }

            [Required]
            public User User { get; set; }

            [MaxLength(512)]
            [Required(ErrorMessage = "Email is required")]
            public string Email { get; set; }
        }

1 个答案:

答案 0 :(得分:2)

我没有得到与你相同的结果。使用以下控制台应用程序:

   public class EmailDetail
    {
        public EmailDetail()
        {
            // keep sqlserver from blowing up with no datetime set
            EmailSendStartTime = new DateTime(1900, 1, 1);
            EmailSendFinishTime = new DateTime(1900, 1, 1);
        }
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public long Id { get; set; }
        [ForeignKey("User")]
        public long UserId { get; set; }
        [Required(ErrorMessage = "Must have user associted with EmailDetail")]
        public User User { get; set; }
        public long? FromAddressBookEntryId { get; set; }
        public AddressBookEntry FromAddressBookEntry { get; set; }
        public DateTime EmailSendStartTime { get; set; }
        public DateTime EmailSendFinishTime { get; set; }
    }

    public class AddressBookEntry
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
        public long Id { get; set; }
        [ForeignKey("User")]
        public long UserId { get; set; }
        [Required]
        public User User { get; set; }
        [MaxLength(512)]
        [Required(ErrorMessage = "Email is required")]
        public string Email { get; set; }
        public bool WhiteList { get; set; }
    }

    public class User
    {
        public long UserId { get; set; }
        public string Username { get; set; }
    }

    public class CFContext : DbContext
    {
        public DbSet<AddressBookEntry> AddressBookEntries { get; set; }
        public DbSet<User> Users { get; set; }
        public DbSet<EmailDetail> EmailDetails { get; set; }

        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var db = new CFContext();

            var y = (from data1 in db.EmailDetails
                     join data2 in db.AddressBookEntries on data1.FromAddressBookEntryId equals data2.Id
                     orderby data1.EmailSendFinishTime descending
                     select data1.EmailSendFinishTime).FirstOrDefault();

            string username = "1";

            var x = db.EmailDetails.Where(a => a.User.Username == username && a.FromAddressBookEntry.WhiteList).
                                        Select(a => new
                                        {
                                            a.EmailSendFinishTime
                                        }).
                                        OrderByDescending(
                                            a => a.EmailSendFinishTime)
                                        .FirstOrDefault();

            Console.WriteLine(y);
            Console.WriteLine(x);
        }
    }

我得到了这些SQL查询

SELECT TOP (1) 
[Extent1].[EmailSendFinishTime] AS [EmailSendFinishTime]
FROM [dbo].[EmailDetails] AS [Extent1]
WHERE [Extent1].[FromAddressBookEntryId] IS NOT NULL
ORDER BY [Extent1].[EmailSendFinishTime] DESC


SELECT TOP (1) 
[Project1].[C1] AS [C1], 
[Project1].[EmailSendFinishTime] AS [EmailSendFinishTime]
FROM ( SELECT 
    [Extent1].[EmailSendFinishTime] AS [EmailSendFinishTime], 
    1 AS [C1]
    FROM   [dbo].[EmailDetails] AS [Extent1]
    INNER JOIN [dbo].[Users] AS [Extent2] ON [Extent1].[UserId] = [Extent2].[UserId]
    INNER JOIN [dbo].[AddressBookEntries] AS [Extent3] ON [Extent1].[FromAddressBookEntryId] = [Extent3].[Id]
    WHERE ([Extent2].[Username] = @p__linq__0) AND ([Extent3].[WhiteList] = 1)
)  AS [Project1]
ORDER BY [Project1].[EmailSendFinishTime] DESC

您的模型中还有其他内容,或者上面的SQL查询还有其他内容吗?