这是一个两部分问题,用于教育目的,而不是试图找到问题的解决方案。
我已经看过这个并且意识到它与我的问题非常相似
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
答案 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)。