[英]Entity framework is generating SQL that returns the entire table
当我尝试加入一些表时,实体框架似乎正在返回整个表。 由于此表很大,因此我只需要返回所需的行即可。
我有三个表:
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表上看不到第一个或第二个查询。
您错过了查询中的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
中使用from pe in proj.ProjectEmails
其中proj.ProjectEmails
是IEnumerable类型。 因此,此LINQ查询成为LINQ-to-objects查询。 这就是为什么它在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();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.