我面临一个简单的linq查询的大问题..我正在使用EF 4.0 .. 我试图使用linq查询从表中获取所有记录:
var result = context.tablename.select(x=>x);
这导致的行数少于正常的SQL查询select * from tablename
;
这个表有超过5个表作为子对象(外键关系:一对一,一对多等)..
执行该linq语句后,此结果变量返回包含所有子对象值的记录,而不执行include语句。
我不知道它是EF 4.0的默认行为。
我在linqpad中尝试过这个声明..但没有用......
但有趣的是,如果我在同一个表上进行连接,另一个表工作相同是sql内连接和计数是相同的..但我不知道为什么它与该表的行为不同...
在返回该父表的所有记录之前,它是否正在与所有子表进行内连接?
请帮帮我..
答案 0 :(得分:0)
解决这些类型问题的最简单方法是查看ORM工具生成的SQL。
如果您使用的是SQL Server,请使用SQL Profiler
查看生成的SQL。
根据您的描述,可能的解释可能是您的实体之间的关系是强制性的,从而强制INNER
加入而不是LEFT OUTER
加入。
答案 1 :(得分:0)
此表有超过5个表 子对象(外键关系: 一对一,一对多等)..
执行后的结果变量 linq语句返回记录 所有子对象值没有 做一个包含声明..
所以我们可能在SSDL中谈论数据库视图或自定义DefiningQuery
。
我描述了the same behavior here。基于连接表的实体可能没有针对每个重新生成的行的唯一标识,因此您的问题是身份映射。您必须手动配置实体的实体密钥。它应该是基于连接表中所有主键的复合键。实体密钥用于标识indenty map中的实体。如果每个记录没有唯一键,则仅使用带有新密钥的第一个记录。如果你没有手动指定密钥,那么EF已经自己动手了。