LINQ逻辑连接VS内连接

时间:2014-04-17 00:00:49

标签: c# sql linq

我想知道一个人的表现更好

//Logical
var query = from i in db.Item
            from c in db.Category
            where i.FK_IdCategory == c.IdCategory
            Select new{i.name, c.name};
//or

//Join
var query2 = from i in db.Item
             join c in db.Category
             on c.ID equals i.FK_IdCategory
             Select new{i.name, c.name};

3 个答案:

答案 0 :(得分:0)

这取决于您使用的ORM以及优化后端查询的智能程度。 如果你没有完美地完成你的linq,实体框架可以生成一些非常糟糕的SQL,所以我假设query2更好。

唯一可以确定的方法是检查两个查询生成的SQL。 仔细观察它,看起来像query1会导致两个表完全被拉,然后在你的应用程序中相互过滤,而query2肯定会在查询中生成一个INNER JOIN,这将让SQL Server做它做的事情最好的 - 设定逻辑。

该FK_IdCategory字段是该表上实际外键索引的成员吗?如果没有,那么这样做(并将名称列包含在索引中的包含列中),您的查询将具有非常高的性能。

答案 1 :(得分:0)

两个查询的性能实际上取决于您使用哪个LINQ提供程序和哪个RDBMS。假设SQL Server,第一个将生成以下查询:

select i.name, c.name
from Item i, Category c
where i.FK_idCategory = c.IdCategory

而第二个会产生:

select i.name, c.name
from Item i
inner join Category c
    on i.FK_idCategory = c.IdCategory

在SQL Server中的操作与在Explicit vs implicit SQL joins

中解释的完全相同

答案 2 :(得分:0)

使用linq2Sql或EntityFramework,您可能会执行以下操作:

var query = from i in db.Item
            select new {i.name, i.Category.Name}

这将生成正确的SQL内部联接。

我确实假定Item和Category之间存在外键关系。