【发布时间】:2009-10-25 19:52:42
【问题描述】:
我最近在 msdn 的 Entity Framework 论坛上遇到了一个问题: http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/bb72fae4-0709-48f2-8f85-31d0b6a85f68
提出问题的人尝试进行一个相对简单的查询,涉及两个表、一个分组、排序依据和一个使用 Linq-to-Entities 的聚合。一个非常简单的 Linq 查询,在 SQL 中也很简单——人们每天都在尝试做的事情。
但是,当使用 Linq-to-Entities 时,结果是一个复杂的查询,其中包含许多不必要的连接等。我尝试了它,但无法让 Linq-to-Entities 从中生成一个像样的 SQL 查询,如果使用只是针对 EF 实体的纯 Linq。
看到来自 EF 的大量怪物查询后,我想也许 OP(还有我,and others)做错了什么。也许有更好的方法来做到这一点?
所以这是我的挑战:使用the example from the EF forum 并仅对两个实体使用 Linq-to-Entities,是否可以让 EF 生成 SQL 查询而无需不必要的连接和其他复杂性?
我希望看到 EF 生成的东西更接近于 Linq-to-SQL 对相同类型的查询所做的事情,同时仍然针对 EF 模型使用 Linq。
限制:使用 EFv1 .net 3.5 SP1 或 EFv4(beta 1 是 VS2010/.net4 beta 的一部分,可从 Microsoft 下载)。不允许使用 CSDL->SSDL 映射技巧、模型“定义查询”、存储过程、数据库端函数或视图。模型和数据库之间只是简单的 1:1 映射,以及一个纯粹的 L2E 查询,它可以满足 MSDN 上原始线程的要求。两个实体之间必须存在关联(即我对原始线程的“解决方法#1”回答不是有效的解决方法)
更新:增加了 500pt 的赏金。玩得开心。
更新:如上所述,使用 EFv4 / .net 4(β1 或更高版本)的解决方案当然有资格获得赏金。如果您使用的是 .net 4 post β1,请提供内部版本号(例如 4.0.20605)、您使用的 L2E 查询以及它生成并发送到数据库的 SQL。
更新:此问题已在 VS2010 / .net 4 beta 2 中修复。虽然生成的 SQL 仍然有几个 [相对无害的] 额外嵌套级别,但它没有任何作用它曾经的坚果味。在 SQL Server 的优化器尝试之后的最终执行计划现在已经尽可能好。 +++ 为负责 EFv4 的 SQL 生成部分的帅哥和帅哥...
【问题讨论】:
-
我无法理解您要展示的内容。我很犹豫是否要提供一个只会用来抨击某人的第一次修订技术的答案。
-
我不想展示任何东西,我想知道是否可以使用 L2E/EF v1 (.net 3.5) 或 v2 (v4 / .net 4.0) 生成 SQL 查询多余的额外连接等。我相信一定有办法,但我做不到。因此,为了保持我的好奇心,我悬赏了一个相对简单的问题的答案——希望这应该鼓励那里的人找到一种方法来做到这一点。我之所以选择我所做的具体示例,是因为最初提出问题的人使用非常简单的查询提供了一个简单的重现。
-
...继续...如果可以修复这个简单的查询,更复杂的查询也可以使用[无论这个问题的答案是什么]-技术/查询组合来修复。
标签: entity-framework linq-to-entities