當我嘗試連接幾個表時,實體框架似乎正在返回整個表。由於這個表格非常大,我需要它只返回所需的行。實體框架正在生成返回整個表的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表。
您提供的表定義,EF編寫的查詢和您說它生成的SQL之間似乎存在斷開連接。你說Email表包含EmailID,Subject,Body,並且查詢返回整個表,但SQL是通過EmailID和一個未提及的HtmlFlag。介意澄清? – 2012-01-04 04:32:37
對不起,安東尼,我已經縮短了所有的可讀性,有更多的專欄,我剛剛刪除了不必要的。 – Rocklan 2012-01-04 05:20:32