非常に低速で動作するリクエストが 1 つあります。
しかし、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
問題は、生成されたクエリの最後にEntity Framework を追加する方法です。
今のところ、ストアド プロシージャを使用して機能させていますが、良い解決策には見えません。
IQueryable
私たちは私たちに与えるすべての能力を失います。- すべてのクエリ/選択ロジックはアプリケーションに保存されますが、この部分はデータベースに保存する必要があります。
UPDATE (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();