Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架正在生成返回整个表的SQL_C#_Linq_Entity Framework - Fatal编程技术网

C# 实体框架正在生成返回整个表的SQL

C# 实体框架正在生成返回整个表的SQL,c#,linq,entity-framework,C#,Linq,Entity Framework,当我尝试连接几个表时,实体框架似乎返回整个表。由于这个表相当大,我需要它只返回所需的行 我有三张桌子: Project - ProjectID, ProjectName ProjectEmail - ProjectEmailID, ProjectID, EmailID, RemovedFlag, CreatedBy Email - EmailID, Subject, Body 我正在尝试检索特定项目的电子邮件数据。 当我这样做时: using (Database

当我尝试连接几个表时,实体框架似乎返回整个表。由于这个表相当大,我需要它只返回所需的行

我有三张桌子:

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

}
很好,除了第二个查询生成:

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();

您提供的表定义、您编写的EF查询和您所说的它生成的SQL之间似乎存在着脱节。您说Email表包括EmailID、Subject、Body,查询返回整个表,但是SQL超过了EmailID和未提及的HtmlFlag。想澄清一下吗?抱歉,安东尼,为了便于阅读,我把它全部缩短了,那里有很多列,我刚刚删除了不必要的列。关闭,但不完全关闭。“proj”已经只包含我需要的projectemail,所以将该表加入Email表就可以了。这个查询实际上返回了正确的数据,所以我不知道它到底是如何工作的。这是有道理的!我添加了pe.projectd=proj.projectd。。。现在它生成了两个查询,哈,你一定会笑的。第一个返回整个电子邮件表,第二个查询ProjectEmail表!我是这个实体框架的新手,对导航属性一无所知。我这样做对吗?@LachlanB,对于导航属性,您应该能够编写类似于
var proj=context.Projects.Include(“ProjectEmails.Email”).Where(yourPredicateHere.FirstOrDefault()这应该以一个序列的方式加载项目及其项目电子邮件,每个项目电子邮件还包括电子邮件记录,所有这些都在一个查询中。试试看。我在验证的时候删除了我的原始评论,如果你需要的话,很抱歉,但看起来Eranga在更新的答案中抓住了核心(我投了更高的票)。@Eranga,这是有道理的。我现在的问题是e.ProjectID不存在,因为它是一种多对多关系。
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();
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();