我最近开始研究linq,我想知道我有2个相关的表Project(< = with fkAccessLevelId)和AccessLevel,我想只从两个表中选择值。现在有两种方法可以从这些表中选择值。
我经常使用的是:
(from P in DataContext.Projects
join AL in DataContext.AccessLevel
on P.AccessLevelId equals AL.AccessLevelId
select new
{
ProjectName = P.Name,
Access = AL.AccessName
}
另一种方法是:
(from P in DataContext.Projects
select new
{
ProjectName = P.Name,
Access = P.AccessLevel.AccessName
}
我想知道的是,如果我们用包含数千条记录的1-2个表增加表5-6的数量,这些方法中的哪一种是有效的??
答案 0 :(得分:0)
您应该看看生成的SQL。您必须了解Linq查询中有几个主要的性能瓶颈(在这种情况下,我假设一个OMG ... Linq to SQL?!?!)通常的主要瓶颈是服务器上的SQL查询。
通常SQL Server有一个非常好的优化器,所以实际上,给定相同的查询,重构,perf是非常统一的。
但是在您的情况下,两个查询之间存在非常明显的差异。没有访问级别的项目不会出现在第一个查询中,而第二个查询将返回null AccessName。实际上,您需要将LEFT JOIN
与INNER JOIN
进行比较。
TL:DR对于执行相同操作的SQL Server / Linq to Entity Framework查询应该提供类似的性能。但是,您的查询远非类似。