2009-06-18 8 views
2

Je continue à obtenir une exception au sujet LINQ aux entités ne supportant pas les expressions de requête certaion comme ceci:LINQ to Entities requêtes Oddity

MyDataContext db = new MyDataContext() 
Brand = db.Brands.First(b => b.BrandId == Int32.Parse(brandIdString)) 

Je ne cherche pas à passer le long de la chaîne analyse syntaxique à la banque d'entité, je je veux juste analyser cette chaîne dans un entier pour la comparaison. Est-ce que le seul travail autour de faire cela avant la main ou suis-je totalement hors ici?

+0

Btw, cela rend également très difficile de faire des projections avec EF –

+0

Et vous ne pouvez pas faire l'inverse non plus, disons Où (expression) .Sélectionner (item => item.ToString()) car il a aucun moyen d'exprimer ToString dans une requête. –

Répondre

6

La meilleure option (au moins pour l'exemple que vous avez donné) est de retirer l'opération de votre déclaration LINQ:

Int32 brandId = Int32.Parse(brandIdString) 
MyDataContext db = new MyDataContext() 
Brand = db.Brands.First(b => b.BrandId == brandId) 

Explication:

Lorsque vous utilisez LINQ, il veut trouver des moyens pour décharger autant de travail qu'il peut à votre requête de base de données. Pour ce faire, il crée en fait un arbre d'expression de toutes les choses que vous lui dites de faire dans vos différentes expressions lambda. Ensuite, lorsque vous voulez exécuter la requête, elle décide quelle instruction SQL sera la meilleure pour faire ce que vous lui avez demandé de faire. Cela lui permet de faire une très belle optimisation. Cependant, s'il ne sait pas comment convertir quelque chose en une instruction SQL, il se fâche sur vous lorsque vous essayez d'exécuter la requête.

-2

Oui. C'est nul. Je trouve que vous devez faire l'analyse ou la normalisation des données en dehors de la requête ... puis passer dans les résultats. Je suis tombé sur ceci en essayant de faire un formatage de date dans les limites de la requête. J'ai fini par le déplacer hors de la requête dans une variable de chaîne et ensuite passé dans la variable avec le formatage approprié déjà appliqué.

LAME - Entity Framework a un long chemin à parcourir!

+0

Étrange que j'ai dit la même chose que la réponse acceptée, mais a fini par descendre a voté pour cela! (: P) –

+0

Oui, c'est ennuyeux quand les gens déprécient sans vous dire pourquoi. – StriplingWarrior

0

Pouvez-vous utiliser ceci?

MyDataContext db = new MyDataContext(); 
Brand b = db.Brands.Where(b => b.BrandId == Int32.Parse(brandIdString)).First(); 

Une solution de rechange (ne pas utiliser lambdas ...) est la suivante:

MyDataContext db = new MyDataContext(); 

Brand b = (from Brand b in db.Brands 
      where b.BrandId == Int32.Parse(brandIdString) 
      select b).First(); 

(, vous aussi le manque ; à la fin de chaque ligne de code, et vous n'avez pas a spécifié un nom de variable pour tout ce que vous obtenez de la requête, mais je suppose que ce sont des fautes de frappe seulement ici ...)

+0

Probablement ne fonctionnera toujours pas. Je devine que le cadre n'a pas un moyen d'exprimer cela dans une requête quand il essaye de casser l'où vers le bas. Il doit évaluer cela dans son ensemble puisque c'est juste un tas d'Expressions enchaînées. Était-ce linq aux collections, tout irait bien. C'est pour les lambdas. –

+0

Ne fonctionne pas non plus, essayé. –

0

La base de données n'existe pas pour répondre aux besoins d'analyse des chaînes. Effectuez l'analyse nécessaire avant de l'impliquer.