J'ai remarqué un comportement Linq to Entities très étrange si les fonctions définies par l'utilisateur (qui sont correctement déclarées et connectées à Linq) sont utilisées dans la requête Linq. Supposons que j'exécute l'instructionLinq to Entities: l'utilisation de la fonction provoque plusieurs requêtes
var list = (à partir de ts dans context.Tests sélectionnez MyFunction (ts.TestId));
Linq génère une requête SQL Select correcte, qui utilise correctement MyFunction. Mais le problème est le suivant: Linq génère et envoie cette instruction pour chaque ligne de la table au lieu de l'envoyer une seule fois! J'ai regardé dans le profileur SQL et j'ai constaté que le nombre de fois que cette instruction Select est envoyée au serveur est exactement le nombre d'enregistrements dans la table de test ... Qu'est-ce que c'est? Est-ce un autre bug dans Linq à Entities? Est-ce que quelqu'un sait une solution de contournement? Comme un tel comportement rend les fonctions de la base de données inutilisables.
Bien sûr, MyFunction() doit être exécuté autant de fois qu'il y a d'enregistrements dans la table. Ce n'est pas mon problème. Le problème est que l'instruction SQL elle-même (sélectionnez MyFunction (TestId) from Test) est envoyée au serveur SQL 25 fois! Si vous regardez dans SQL Profileer et vérifiez ce qui se passe derrière l'exécution de cette déclaration, vous comprendrez de quoi je parle. –
@Dimitry - Évidemment, je n'ai ni votre code ni votre base de données, donc je ne peux pas simplement "regarder dans le profileur SQL". Cela peut être utile si vous publiez plus de code, en particulier un qui évalue votre requête linq. –
Vous n'avez pas besoin de ma base de données ou mon code pour regarder ce problème très générique. Créez simplement une fonction définie par l'utilisateur, connectez-la avec Linq to Entities et exécutez n'importe quelle requête Linq, qui utilise cette fonction. Maintenant, regardez SQL profiler et vous verrez qu'il traite un nombre anormalement élevé de requêtes (au lieu de seulement 1 requête, ce qui est attendu). –