2010-03-31 5 views
1
using(SampleEntities entities = new SampleEntities()) { 
var userMap = from ad in entities.SampleGroupsSet 
       from uid in distinctUserIDs 
       where ad.ShortUserID.ToLower() == uid.ToLower() 
       select new {shortID = uid, longID = ad.UserID}; 

string userID = "sampleId"; 
var longIDs = from map in userMap 
       where map.shortID.ToLower() == userID.ToLower() 
       select map.longID; 

if (longIDs != null && longIDs.Count() > 0) 
{ 
    ... 
} 
... 

Je me présente dans un problème où si j'Interrogation pour le comte de longIDs je reçois une exception:LINQ to Entities question

« Impossible de créer une valeur constante de type « fermeture type 'Seuls les types primitifs (' tels que Int32, String et Guid ') sont supportés dans ce contexte. "

Est-ce que quelqu'un a rencontré cela? Merci.

+0

copie possible http://stackoverflow.com/questions/879411/entity-framework-unable-to-create-a-constant-value-of-type-closure-type – Andrey

+1

Pas tout à fait dupe IMHO. Même erreur, mais solution correcte différente. –

Répondre

1

Vous avez deux problèmes. Cela:

uid.ToLower() 

... ne peut pas être converti en SQL. Cela:

  where map.shortID.ToLower() == userID.ToLower() 

est la mauvaise façon de faire une restriction insensible à la casse. Il bat en utilisant un index, et provoque le problème que vous référencez. Au lieu de cela, faites:

  where map.shortID.Equals(userID, StringComparison.OrdinalIgnoreCase) // or whatever... 

Deuxième numéro: Vous semblez essayer de faire un "où". Mais c'est la mauvaise façon. Dans EF 4, vous faites:

where distinctUserIDs.Contains(ad.ShortUserID) 

Dans EF 1 c'est more involved.

+0

Hmm, toujours le même problème. Que voulez-vous dire qu'il bat en utilisant un index? –

+0

Ah, raté l'autre problème (vous en avez deux). Je vais mettre à jour. 'col.ToLower' est converti en SQL comme' LOWER (col) ', ce qui signifie qu'un index sur' col' ne peut pas être utilisé. –

+0

Je ne pense pas que Contient est pris en charge avec L2E ... ai-je raison? http://blogs.msdn.com/alexj/archive/2009/03/26/tip-8-writing-where-in-style-queries-using-linq-to-entities.aspx –