EF直接查询一张子表的注意事项

项目用到的一个查询,看着再简单不过的查询,没想到居然栽跟头了。

有两张表,一张主表,一张子表【1→多】

在这里我主要是想对子表操作,之所以加主表,是因为在添加子表数据的时候,可以只用一个主表的对象,然后用上下文添加一次,EF自动开存储过程,自动添加关联子表数据。如果大家有什么好的办法让子表一次添加一千多条数据,请指教。【因为我也不太想这样添加数据】

问题就出现在我查询这个子表数据的时候

我的查询语句是这样写的

然后奇迹出现了,按照我的条件约束,查询出来的数据应该只有一两条数据,但是,查询出的结果却是全部数据,没错是那1千多条数据,都被查出来了。

在这里我走了弯路,我以为是我的where条件写的不对,其实查询条件没写错。【改条件耗了将近2小时】

那么我将直接给出问题的解决思路。

思路是使用SQL Server Profiler查看最终执行的SQL语句是什么

开始→所有程序→Microsoft SQL Server 2008 R2→性能工具→SQL Server Profiler

【打开软件后新建一个跟踪】文件→新建跟踪→用sa账户登录→不需要改设置直接点击【运行】

根据这种方法我查出当我执行这段EF代码的时候,他对数据库进行了三次操作

第一次:返回了我正确的结果,就2条数据

第二次:他根据子表的所有外键值,去找对应的所有主表的数据

第三次:他根据第二次从主表中找到的所有主键值,又去查找对应的子表中的数据【这一次查找,便没有了我最开始的约束条件】

很明显,三次的查询,一定以最后一次为准,给我返回数据,这就是全部的数据。

最后问题解决了,我将EF的查询方法改为如下即可

所做的改动是 select ,原来直接select ,现在查询部分列了。而现在查询的部分列中不包含外键字段。我想就是因为这个外键吧。

不过这只是猜测,我不知道怎么去验证,求大家意见建议,互相学习共同进步。

时间: 2024-12-28 20:29:17

EF直接查询一张子表的注意事项的相关文章

oracle查询包含在子表中的主表数据

Oracle数据库,查询某表中包含在子表中的数据,子表中数据按特定条件来源于该父表,SQL命令如 select * from a_table a where a.commandId in (select commandId from b_table where type = 1) a_table父表,b_table子表,a和b表都有commandId列,a表的commandId主键关联b表中的外键commandId,要求a表中commandId包含在b表commandId中,且b表的type黑白

关联查询一张小表。对性能有影响吗(mysql)

具体语句 SELECT dfm.id, dfm.member_code, dfm.member_name, dfm.recommend_code, dfm.member_rank, dfm.create_time, dfm.account, dfm.have_account, dfm.member_img, dfmr.rank_name, dfmr.grade_commission_ratio, dfm1.member_name AS recommendName FROM d_fx_member

MySQL多表查询之外键、表连接、子查询、索引

一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两张表:部门表(dept).员工表(emp).Id=Dept_id,而Dept_id就是员工表中的外键:因为员工表中的员工需要知道自己属于哪个部门,就可以通过外键Dep

MySQL数据库学习笔记(六)----MySQL多表查询之外键、表连接、子查询、索引

注:本文转自:http://www.cnblogs.com/smyhvae/p/4042303.html 本章主要内容: 一.外键 二.表连接 三.子查询 四.索引 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 上面有两

数据库SQL Server2012笔记(四)——多表查询、子查询、分页查询、用查询结果创建新表和外连接

1.多表查询 1)笛卡尔集: select  *  from  表名1,表名2 select  *  from  表名1,表名2  where   表名1.字段名=表名2.字段名 注: 若有两张表有相同名字的字段,则使用时需带表名(别名). order  by  置于where 条件之后. 2)自连接:同一张表的连接查询,将一张表视为两张表或多张表. eg:显示公司每个员工名字和他的上级的名字.将emp表看做两张表worker和boss select  worker.ename  雇员,boss

mysql查询语句 和 多表关联查询 以及 子查询

原文地址: http://blog.csdn.net/github_37767025/article/details/67636061 1.查询一张表: select * from 表名: 2.查询指定字段:select 字段1,字段2,字段3-.from 表名: 3.where条件查询:select 字段1,字段2,字段3 frome 表名 where 条件表达式: 例:select * from t_studect where id=1; select * from t_student wh

拿字段数据直接查询别张表并转出对应

摘要:拿字段数据直接查询别张表并转出对应 SELECT TimesId ,ParliamentName ,ParliamentSequence , ? ParliamentType =? ( ?select CodeValue? ?from SystemCode? ?where Code = ParliamentType and CodeIndex= 'PType' )? ,StartDate ,EndDate ,UseStatus, AssignDate ,CreatedUserId ,Cre

应用子表时如何将开窗查询事件做成多选?

应用子表开窗事件选择的时候,如何将开窗查询事件做成多选? 其实,做一些改造就能达到效果哦 修改SheetTextBox.js的 ListMasterCallBack 函数,将设置控件的值逻辑改为以下方式 检测某个主键字段,是否已经在子表数据存在,如果不存在,则调用子表的新增行方法,将开窗选中行的数据写入新增的子表行中:如果检测某个主键字段值已经在子表中存在,则更新这一行数据: ListMasterCallBack 去除自动关闭窗体代码以便仍然可以继续双击:

mysql查询某张表的外键

mysql和oracle一样也是有数据字典表的,是存在单独的一个库叫INFORMATION_SCHEMA,要查看某张表的外键要从字典表中查找 如mysql查询某张表的外键,可以用下面的方式查询 use INFORMATION_SCHEMA; select TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME,REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME from KEY_COLUMN_USAGE where table_name