C# LINQ2SQL-关于何时发出带有where子句的交叉连接而不是内部连接的更多问题

C# LINQ2SQL-关于何时发出带有where子句的交叉连接而不是内部连接的更多问题,c#,.net,sql-server-2005,linq-to-sql,C#,.net,Sql Server 2005,Linq To Sql,这是一个由两部分组成的问题,用于教育目的,而不是试图找到问题的解决方案 我已经看到了这一点,并且意识到这与我的问题非常相似 但是我希望LINQ和SQL专家提供更多信息,了解为什么在LINQ2SQL中创建交叉连接而不是内部连接。另外,由于这两个查询生成相同的计划,有人能解释SQL Server如何决定执行计划(或链接到更多信息)?据我所知,这意味着查询的性能是相同的 我创建了一个小示例,在我的数据库上运行两个LINQ表达式,生成这两个不同的SQL查询 对于那些不想麻烦的人,下面是我的示例db图:

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

我已经看到了这一点,并且意识到这与我的问题非常相似

但是我希望LINQ和SQL专家提供更多信息,了解为什么在LINQ2SQL中创建交叉连接而不是内部连接。另外,由于这两个查询生成相同的计划,有人能解释SQL Server如何决定执行计划(或链接到更多信息)?据我所知,这意味着查询的性能是相同的

我创建了一个小示例,在我的数据库上运行两个LINQ表达式,生成这两个不同的SQL查询

对于那些不想麻烦的人,下面是我的示例db图:

以下是两个问题: 与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
如果你想亲自看的话,这就是测试程序

谢谢大家的帮助


Mustafa

假设您有一个名为
MyDataContext
的datacontext

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

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

它们是一样的东西,所以不管哪个LINQ2SQL发出

内部联接
在逻辑上等价于带有
的交叉联接,其中
子句过滤器等价于
内部联接
子句的
on

这就是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%'

您知道,如果在
.dbml
文件中设置了关系,则可以访问其他表,而无需在代码中执行文字联接。@尼克-例如:从上下文中的i。其中i.RelatedMembership.CreatedOn