Existe-t-il un moyen d'implémenter une requête avec l'option TSQL dans Entity Framework

Nous avons une request qui fonctionne à très basse vitesse.

Mais il commence à voler si nous ajoutons une clause OPTION dans la requête. Comme ça:

 select distinct d.* from Bundles b, Bundles_Permissions bp, CameraGroupPermissions cgp, Addresses a, Dissortingcts 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.DissortingctId OPTION (HASH JOIN) 

La question est comment faire Entity Framework append cette OPTION à la fin d'une requête générée?

Pour l'instant, nous utilisons des procédures stockées pour le faire fonctionner, mais cela ne semble pas être une bonne solution.

  1. Nous perdons toutes les capacités que nous offre IQueryable .
  2. Toute la logique de requête / sélection est stockée dans notre application mais cette partie nous devons être stockés dans la database.

UPDATE (exemple de requête lente 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 dissortingcts in ((MoscowVideoDbEntities)ObjectContext).Dissortingcts where dissortingcts.Id == cams.Address.DissortingctId select dissortingcts).Distinct().ToList(); 

Si vous pouvez requestr à Entity Framework de soumettre la requête en tant que SQL préparé (ce que vous devez de toute façon), vous pouvez utiliser un plan-guide pour modifier le plan d'exécution de cette requête: http://msdn.microsoft.com/fr-fr/ bibliothèque / ms190417 (v = sql.90) .aspx

Cependant, l'utilisation de conseils de requête devrait toujours être le dernier recours. Au lieu de forcer une jointure de hachage sur les six opérations de jointure de cette requête, ce qui désactive l'optimiseur, vous pouvez envisager d'autres options, telles que l'indexing correcte et des statistics correctement gérées.