我们有一个请求以非常低的速度运行。
OPTION
但是如果我们在查询中添加子句,它就会开始运行。像这样:
select distinct
d.*
from
Bundles b,
Bundles_Permissions bp,
CameraGroupPermissions cgp,
Addresses a,
Districts d,
Cameras c,
Cameras_CameraGroups ccg
where
b.Id = bp.BundleId
and bp.CameraGroupPermissionId = cgp.Id
and cgp.ShortName = 'See-Cameras'
and b.CameraGroupId = ccg.CameraGroupId
and ccg.CameraId = c.Id
and b.UserGroupId = ''
and c.AddressId = a.Id
and c.CameraStateId in (5,3,4,9)
and c.IsDeleted = 0
and d.Id = a.DistrictId
OPTION (HASH JOIN)
问题是如何使实体框架将其添加OPTION
到生成的查询的末尾?
目前我们正在使用存储过程来使其工作,但它看起来不是一个好的解决方案。
- 我们失去了所有
IQueryable
赋予我们的能力。 - 所有查询/选择逻辑都存储在我们的应用程序中,但这部分我们必须存储在数据库中。
更新(linq2Entity 慢速请求示例):
camsResult = from permis in ((MoscowVideoDbEntities) ObjectContext).CameraGroupPermissions
where permis.ShortName == Permissions.CameraGroupSpecific.SeeCameraVideo
from bundles in permis.Bundles
where bundles.UserGroupId == user.UserGroupId
from cams in bundles.CameraGroup.Cameras
where
!cams.IsDeleted
&& (
cams.CameraStateId == (int) CameraStates.InExploitation ||
cams.CameraStateId == (int) CameraStates.OnVerification ||
cams.CameraStateId == (int) CameraStates.Rejected ||
cams.CameraStateId == (int) CameraStates.OnMaintenance
)
&& cams.Address != null
select cams;
var result = (from cams in camsResult
from districts in ((MoscowVideoDbEntities)ObjectContext).Districts
where districts.Id == cams.Address.DistrictId
select districts).Distinct().ToList();