2010-12-14 56 views
0

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.

Répondre

0

Mais c'est exactement ce que vous avez écrit dans votre requête LINQ: sélectionnez un résultat de MyFunction (ts.TestId) pour chaque ligne de la table Tests. Si vous avez 25 lignes dans votre table, votre jeu de résultats contiendra également 25 enregistrements, chacun obtenu en exécutant MyFunction.

Que voulez-vous vraiment faire? Voulez-vous exécuter MyFunction une seule fois? Si oui, quel TestId voulez-vous passer si vous avez 25 enregistrements?

+0

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. –

+0

@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. –

+0

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). –

0

Le problème est résolu. Il s'est avéré que SQL Profiler signalait à tort plusieurs instructions. Le Linq n'envoie en fait qu'une seule déclaration.