У нас есть один запрос, который работает с очень низкой скоростью.
Но он начинает летать, если мы добавим предложение 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)
Вопрос заключается в том, как заставить Entity Framework добавить этот OPTION
в конец сгенерированного запроса?
Пока мы используем хранимые процедуры, чтобы он работал, но это не похоже на хорошее решение.
- Мы освобождаем все возможности, предоставляемые нам
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();