我想知道一个人的表现更好
//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};
答案 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之间存在外键关系。