2012-01-04 77 views
2

當我嘗試連接幾個表時,實體框架似乎正在返回整個表。由於這個表格非常大,我需要它只返回所需的行。實體框架正在生成返回整個表的SQL

我有三個表:

Project  - ProjectID, ProjectName 
ProjectEmail - ProjectEmailID, ProjectID, EmailID, RemovedFlag, CreatedBy 
Email   - EmailID, Subject, Body 

我試圖檢索電子郵件數據的特定項目。 當我這樣做:

using (DatabaseEntities context = new DatabaseEntities()) 
{ 
    Project proj = context.Projects.Where(p => p.ProjectID == ProjectID).FirstOrDefault(); 
    if (proj != null) 
    { 
     List<Email> projectEmails = (from pe in proj.ProjectEmails 
            join e in context.Emails on pe.EmailID equals e.EmailID 
            select e).ToList(); 
    } 

} 

所生成的SQL是這樣的:

exec sp_executesql N'SELECT TOP (1) 
[Extent1].[ProjectID] AS [ProjectID], 
[Extent1].[ProjectName] AS [ProjectName], 
    -- rest of columns appear here 
FROM [dbo].[Project] AS [Extent1] 
WHERE [Extent1].[ProjectID] = @p__linq__0',N'@p__linq__0 int',@p__linq__0=6 

優秀的,不同之處在於第二個查詢產生這樣的:

SELECT [Extent1].[EmailID] AS [EmailID], 
    [Extent1].[Subject] AS [Subject], 
      -- rest of columns appear here 
FROM [dbo].[Email] AS [Extent1] 

電子郵件是一個很大的表我真的不想把整個桌子拉回來! 有沒有更好的方法來返回郵件列表,以便表 加入正確的密鑰?

我也很困惑它是如何知道要返回哪些電子郵件的,因爲我看不到第一個 或第二個查詢加入ProjectEmail表。

+0

您提供的表定義,EF編寫的查詢和您說它生成的SQL之間似乎存在斷開連接。你說Email表包含EmailID,Subject,Body,並且查詢返回整個表,但SQL是通過EmailID和一個未提及的HtmlFlag。介意澄清? – 2012-01-04 04:32:37

+0

對不起,安東尼,我已經縮短了所有的可讀性,有更多的專欄,我剛剛刪除了不必要的。 – Rocklan 2012-01-04 05:20:32

回答

4

您錯過了查詢中的where條件。

List<Email> projectEmails = (from pe in proj.ProjectEmails 
          join e in context.Emails on pe.EmailID equals e.EmailID 
          where pe.ProjectID == proj.ProjectID 
          select e).ToList(); 

編輯

您正在使用from pe in proj.ProjectEmails其中proj.ProjectEmails是IEnumerable的類型。所以這個LINQ查詢變成了LINQ到對象的查詢。這就是爲什麼它會加載context.Emails中的所有電子郵件。嘗試

List<Email> projectEmails = (from pe in context.ProjectEmails 
          join e in context.Emails on pe.EmailID equals e.EmailID 
          where pe.ProjectID == proj.ProjectID 
          select e).ToList(); 
+0

關閉但不完全。 「proj」已經只包含我需要的ProjectEmail,因此將該表連接到Email表上工作正常。查詢實際上是返回正確的數據,所以我很難理解它是如何工作的。 – Rocklan 2012-01-04 05:23:44

+0

這很有道理!我已經添加了pe.ProjectID = proj.ProjectID ...並且它現在生成兩個查詢,哈哈,你必須笑。第一個查詢整個Email表,第二個查詢ProjectEmail表!我是這個實體框架的新手,我對導航屬性一無所知。我是否以正確的方式做這件事? – Rocklan 2012-01-04 05:37:39

+0

@LachlanB檢查編輯答案。 – Eranga 2012-01-04 05:38:38