LINQ2SQL - 更多关于何时发布与where子句交叉连接而不是内连接的问题

时间:2011-03-16 17:44:50

标签: c# .net sql-server-2005 linq-to-sql

这是一个两部分问题,用于教育目的,而不是试图找到问题的解决方案。

我已经看过这个并且意识到它与我的问题非常相似

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是测试程序,如果你想亲眼看看。

感谢大家的帮助。

的Mustafa

2 个答案:

答案 0 :(得分:1)

它们是相同的,所以LINQ2SQL发出的并不重要。

inner join在逻辑上等同于交叉连接,其where子句过滤器等效于on子句的inner join

这就是Sql Server生成相同查询计划的原因。

要清楚,内部联接:

Select f1 
From T1 inner join T2 on T1.k = T2.k
where T1.f2 like 'X%'

与交叉联接相同:

Select f1 
From T1 cross join T2 
where T1.k = T2.k
and T1.f2 like 'X%'

与旧式SQL相同:

Select f1 
From T1, T2 
where T1.k = T2.k
and T1.f2 like 'X%'

答案 1 :(得分:0)

假设您有一个名为MyDataContext的datacontext。

using(MyDataContext db = new MyDataContext())
{
  var q = db.Items.Where(x=> x.Categories.Name == "myCategory").Select(x=> x);
}

这是一个非常简单的示例,但您不需要在TSQL语法中写出连接或子查询。 (我讨厌编写TSQL)。