Linq查询返回的记录少于Sql Query

时间:2011-03-19 05:33:11

标签: asp.net linq entity-framework-4

我面临一个简单的linq查询的大问题..我正在使用EF 4.0 .. 我试图使用linq查询从表中获取所有记录:

var result = context.tablename.select(x=>x);

这导致的行数少于正常的SQL查询select * from tablename;

这个表有超过5个表作为子对象(外键关系:一对一,一对多等)..

执行该linq语句后,此结果变量返回包含所有子对象值的记录,而不执行include语句。

我不知道它是EF 4.0的默认行为。

我在linqpad中尝试过这个声明..但没有用......

但有趣的是,如果我在同一个表上进行连接,另一个表工作相同是sql内连接和计数是相同的..但我不知道为什么它与该表的行为不同...

在返回该父表的所有记录之前,它是否正在与所有子表进行内连接?

请帮帮我..

2 个答案:

答案 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已经自己动手了。