【发布时间】:2011-03-17 05:43:14
【问题描述】:
这是一个由两部分组成的问题,用于教育目的,而不是试图找到问题的解决方案。
我已经看过这个并意识到它与我的问题非常相似
LINQ2SQL - Cross join emitted when I want inner join
但我希望 LINQ 和 SQL 专家能提供更多关于为什么在 LINQ2SQL 中创建交叉联接而不是内部联接的信息。此外,有人可以解释 SQL Server 如何决定执行计划(或链接到更多信息),因为这两个查询都会生成相同的计划?据我了解,这意味着查询的性能是相同的。
我创建了一个小示例,在我的数据库上运行两个 LINQ 表达式,生成这两个不同的 SQL 查询。
对于那些不想打扰的人,这是我的示例数据库图: http://dl.dropbox.com/u/13256/Screen%20shot%202011-03-16%20at%2011.41.56%20AM.png
以下是两个查询: 使用 Where 子句交叉连接
var q = from item in context.Items
join i_mem in context.Memberships on new { item_id = item.ID, user_id =
current_user_id.Value } equals new { item_id = i_mem.RelatedItemID, user_id =
i_mem.RelatedUserID } into sq_i_m
from im in sq_i_m.DefaultIfEmpty()
join i_cat in context.Categories on item.RelatedCategoryID equals i_cat.ID
into sq_i_cat
from proj in sq_i_cat
select item;
内连接
from item in context.Items
join i_mem in context.Memberships on
new { item_id = item.ID, user_id = current_user_id.Value }
equals
new { item_id = i_mem.RelatedItemID, user_id = i_mem.RelatedUserID }
into sq_i_m
from im in sq_i_m.DefaultIfEmpty()
join i_cat in context.Categories on item.RelatedCategoryID equals i_cat.ID
select item
如果您想亲眼看看,here 是测试程序。
感谢大家的帮助。
穆斯塔法
【问题讨论】:
-
您确实知道,如果您在
.dbml文件中设置了关系,则无需在代码中进行文字连接即可访问其他表。 -
@Nick - 例如:从 i in context.Items where i.RelatedMembership.CreatedOn
标签: c# .net sql-server-2005 linq-to-sql