2009-11-18 4 views
1

J'ai une simple requête Linq ci-dessous:Entity Framework avec SQL Server 2000 (APPLIQUER opérateur) numéro

var seq = (from n in GetObjects() 
      select n.SomeKey) 
      .Distinct() 
      .Count(); 

Cette requête fonctionne avec SQL Server trouver 2005 et au-dessus.

Mais, cela commence à donner mal à la tête lorsque j'ai accroché le EF à SQL Server 2000. Parce que EF utilise l'opérateur APPLY que seul SQL Server 2005 et ci-dessus peuvent être pris en charge. Je ne sais pas pourquoi EF utilise l'opérateur APPLy à la place des sous-requêtes.

Mon travail actuel est autour de:

var seq = (from n in GetObjects() 
       select n.SomeKey) 
       .Distinct() 
       .ToList() 
       .Count(); 

Mais, je peux forsee plus de problèmes à venir. La requête ci-dessus est juste une simple.

Quelqu'un a-t-il rencontré ce problème? Et comment vous travaillez autour de ça? Ou existe-t-il un moyen de forcer EF à ne pas utiliser l'opérateur APPLY?

Toute aide sera grandement appréciée.

Comment Lun.

Répondre

1

Le problème est que vous avez généré votre modèle par rapport à une base de données 2005 (ou supérieure). Ainsi, le concepteur de GUI a mis une valeur ProviderManifestToken de 2005 ou 2008 dans l'EDMX. Cela provoque le fournisseur SQL Server pour générer SQL optimisé pour ces versions. Pour résoudre ce problème:

  1. Cliquez sur votre fichier EDMX avec le bouton droit de la souris.
  2. Ouvrir avec l'éditeur XML.
  3. Rechercher ProviderManifestToken
  4. Change 2000
  5. Enregistrer et exécuter.
+0

Oui, j'ai généré l'edmx contre une base de développement 2005. Mais j'ai changé la valeur de ProviderManifestToken en 2000, pour vérifier si EF utilise SQL Server 2000 requête compatible. MAIS .... malheureusement, EF jette une exception disant que l'opérateur APPLY est supporté par 2005 et au-dessus seulement, chaque fois que nous utilisons des requêtes complexes qui impliquent plusieurs tables, agrégation, etc –

+0

OK, donc le problème est en fait complètement différent de ce que vous dit dans ta question! L'EF ne génère pas le mauvais SQL; Au contraire, il dit qu'il ne sait pas comment exprimer votre requête sous une forme que SQL 2000 peut gérer. Ces choses se produisent lorsque vous utilisez un serveur de base de données de 10 ans. L'EF ne peut pas, par magie, faire en sorte que SQL 2000 acquière tous les verbes SQL requis pour exprimer tout ce que vous pouvez faire dans LINQ. Vous devez soit modifier votre requête, soit changer votre serveur de base de données. –

+0

Je n'ai pas dit que EF générait le mauvais SQL. En tant qu'ORM, EF n'est "pas assez intelligent" (probablement volontairement) pour ne pas utiliser l'opérateur APPLY lorsque ProviderManifestToken est défini sur 2000. Changer de base de données est parfois une mission impossible pour beaucoup d'organisations de taille moyenne à grande. Dans mon cas, non. Donc, si vous remarquez ma question, je demande si quelqu'un a une solution de contournement pour faire ma requête ci-dessus pour travailler avec SQL Server 2000 et EF ... –