问题描述
我有很少的大桌子,我需要加入它们.在SQL中看起来像:
select * from dbo.Table1 t1 join dbo.Table1 t1Parent on t1.ParentId = t1Parent.Id join dbo.MappingT1T3 t2 on t1Parent.Id = t2.ExternalId and t2.[Type] = 1 join dbo.Table3 t3 on t2.ForeignId = t3 .Id where t1.[Type] = 3
尝试将此查询转换为这样的linq:
from t1 in dbo.Table1 join t1Parent in dbo.Table1 on t1.ParentId equals t1Parent.Id join t2 in dbo.MappingT1T3 on new { Id = t1Parent.Id, [Type] = (int)1 } equals new { Id = t2.ExternalId, [Type] = (int)t2.[Type] } join t3 in dbo.Table3 on t2.ForeignId equals t3.Id where t1.[Type] == 3;
,但似乎执行计划有很大不同.个人资料说,它试图在没有条件的情况下加载所有表.
推荐答案
尝试将常数放在单独的条件下...
from t1 in dbo.Table1 where t1.[Type] == 3 // <--- PUT THIS ONE HIGHER join t1Parent in dbo.Table1 on t1.ParentId equals t1Parent.Id join t2 in dbo.MappingT1T3 on t1Parent.Id equals Id = t2.ExternalId where (int)t2.[Type] == 1 // <--- SEPARATE CONDITION join t3 in dbo.Table3 on t2.ForeignId equals t3.Id;
问题描述
I have few large tables and I need to join them. In SQL it looks like:
select * from dbo.Table1 t1 join dbo.Table1 t1Parent on t1.ParentId = t1Parent.Id join dbo.MappingT1T3 t2 on t1Parent.Id = t2.ExternalId and t2.[Type] = 1 join dbo.Table3 t3 on t2.ForeignId = t3 .Id where t1.[Type] = 3
Tried to convert this query to a such LINQ:
from t1 in dbo.Table1 join t1Parent in dbo.Table1 on t1.ParentId equals t1Parent.Id join t2 in dbo.MappingT1T3 on new { Id = t1Parent.Id, [Type] = (int)1 } equals new { Id = t2.ExternalId, [Type] = (int)t2.[Type] } join t3 in dbo.Table3 on t2.ForeignId equals t3.Id where t1.[Type] == 3;
But seems execution plan differs a lot. Profile says that it tries to load all tables without conditions..
推荐答案
Try putting the constant to a seperate condition...
from t1 in dbo.Table1 where t1.[Type] == 3 // <--- PUT THIS ONE HIGHER join t1Parent in dbo.Table1 on t1.ParentId equals t1Parent.Id join t2 in dbo.MappingT1T3 on t1Parent.Id equals Id = t2.ExternalId where (int)t2.[Type] == 1 // <--- SEPARATE CONDITION join t3 in dbo.Table3 on t2.ForeignId equals t3.Id;