2010-01-20 4 views
1

J'ai un champ dans ma base de données qui est varchar (1). Je ne suis pas autorisé à le changer. Les seules valeurs de ce champ sont 0 ou 1.Problème de filtre Linq impliquant un champ varchar (1)

Voici la clause where de la requête LINQ:

where 
g.id_Group == idGroup && 
a.AccountOpen.Value == '1' 

Ma requête LINQ a généré l'instruction SQL suivante où la clause

WHERE ([t1].[id_Group] = 1234) AND (UNICODE([t0].[AccountOpen]) = '1') 

« compteOuvrir 'est le champ varchar (1).

J'ai changé la clause where manuellement

WHERE ([t1].[id_Group] = 1234) AND ([t0].[AccountOpen] = '1') 

La deuxième requête renvoie les lignes de données et le premier ne fonctionne pas. Comment puis-je obtenir ce travail sans modifier le schéma de base de données?

+0

varchar (1)? La personne qui a développé cette base de données savait-elle ce qu'est un varchar? – Will

Répondre

2

Le concepteur VS2008 L2S mappe de façon incorrecte varchar (1) et nvarchar (1) à System.Char. (http://social.msdn.microsoft.com/Forums/en/linqtosql/thread/ac91e587-6e91-454c-9fa2-bab20b7a258c)

Vous pouvez modifier le mappage de vos colonnes [n] varchar (1) le concepteur L2S afin qu'il soit mappé à une chaîne à la place. De cette façon, vous pouvez effectuer des comparaisons de chaînes normales et ne pas obtenir d'exceptions lors de la matérialisation d'enregistrements contenant [n] varchar (1) s vides.

+0

J'ai eu un problème similaire avec un char (1) où le caractère était 'c', 'h' ou 'p' quand il a fait la requête il avait le même problème unicode, changé le mappage en L2S en une chaîne et tout est bon. À votre santé –

1

Avez-vous essayé d'utiliser un string au lieu d'un char pour comparaison?

where 
g.id_Group == idGroup && 
a.AccountOpen.Value == "1" 
+0

Les docs indiquent que CHAR est mappé sur une chaîne tandis que NCHAR est mappé sur char. Je vais essayer ça. – Will

+0

Il est mappé sur char. La comparaison avec la chaîne provoque une erreur de compilation – KClough

+0

Est-ce que vous obtenez toujours une erreur de compilation si vous ajoutez un '.ToString()' à 'a.AccountOpen.Value'? – jball

0

C'est parce que la UNICODE() fonction:

Renvoie la valeur entière, tel que défini par la norme Unicode, pour le premier caractère de l'expression d'entrée

Alors Si le champ AccountOpen contient la valeur "1", la valeur UNICODE() pour cela est 49 ... donc elle ne satisfait pas la condition de recherche (49 <> '1')

Questions connexes