2011-03-19 124 views
1

我面临着简单的LINQ查询一个很大的问题..我用EF 4.0 .. 我试图使用LINQ查询以从表中的所有记录:Linq查询比SQL返回较少记录查询

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

这会导致比正常的sql查询更少的行数select * from tablename;

这个表已经超过500台的子对象(外键关系:一对一和一对多等)..

执行该LINQ语句之后,这一结果变量,所有子对象的值返回记录,而不做一个包括声明..

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

我试过also..but有没有用在linqpad本声明

但有趣的是,如果我做与另一个表在同一个表上的联接工作是一样的是SQL内部联接和计数是相同的..但我不知道为什么它只与该表的行为不同

它是做内部联接在返回该父表的所有记录之前与所有子表联系?

请帮助我..

+0

如果您发布代码,XML或数据样本,请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮(“{}”),以精确地设置格式和语法突出显示它! – 2011-03-19 10:05:41

+1

谢谢..我会在下次做.. – Sunny43 2011-03-19 20:31:37

回答

0

解决这类问题的最简单的方法是看由ORM工具产生的生成的SQL。

如果您使用SQL Server,然后使用SQL Profiler查看生成的SQL。

从您所描述的情况来看,可能的解释可能是您的实体之间的关系是强制性的,从而强制执行INNER连接而不是LEFT OUTER连接。

+0

“强制全外联接”似乎是一个错误。你的意思是INNER加入吗? – 2011-03-19 10:15:39

+0

@George Poleyvoy,你是对的,我相应地更新了我的答案。 – 2011-03-19 11:03:35

+0

我没有在我的机器上的sql分析器,我无法检查分析器结果现在..但我会在星期一更新我的结果..但我做了一个跟踪使用Visual Studio 2010来检查执行的SQL查询LINQ查询..但它与普通的SQL查询相同,没有任何与任何子表连接..有无论如何关闭子表加载选择一个父表..感谢很多为您的帮助.. – Sunny43 2011-03-19 19:59:53

0

这个表已经超过5桌为 子对象(外键关系: 一对一和一对多等)..

执行 是LINQ语句返回记录 后,此结果变量有没有 所有子对象的值做一个包括声明..

所以我们可能谈论SSDL数据库视图或定制DefiningQuery。我说的the same behavior here。基于联合表格的实体可能没有每个重新排列的行的唯一标识,因此您的问题是标识映射。您必须手动配置实体的实体密钥。它应该是基于来自连接表的所有主键的复合键。实体键用于识别indenty映射中的实体。如果您没有每个记录的唯一密钥,则仅使用使用新密钥的首次记录。如果您没有手动指定密钥,那么EF已经自行导入。

+0

所有的孩子表有它们自己的主键ID和一个与父表的主键相关的外键ID ..大多数关系是一对多的。 – Sunny43 2011-03-19 19:57:09

+0

你是如何创建'tablename'以及如何定义其关键字的?这是重要的部分。 – 2011-03-19 20:57:10

+1

我犯了一个愚蠢的错误..我发现我的连接字符串不同于我的DAL层对业务...这是我三天挣扎的结束..非常感谢.. – Sunny43 2011-03-22 14:53:51