Comment comparer une colonne de chaîne en nombre (sous forme décimale) dans LINQ
Question
J'ai une base de données avec un champ de quantité - c'est un nombre décimal, bien que le schéma de base de données a la colonne définie comme une chaîne. Je veux être en mesure d'exécuter une requête Linq pour trouver des valeurs basées sur un nombre pour le montant.
Il y a des questions comme cette et this qui parlent en utilisant la méthode CompareTo, mais ne fonctionne pas dans cette situation. Par exemple, je les montants de factures suivantes dans la base de données:
556
130
1450
410
le code suivant:
from t in test
where t.BillAmount.CompareTo("50") > 0
select t
retournera valeur 556
mais aucune des autres valeurs, même si elles sont toutes supérieures à la valeur décimale de 50 ans.
Modification de la ligne où à:
where t.BillAmount.CompareTo("50") < 0
retournera 130
, 1450
et 1450
que ceux sont « moins », puis 50 comme une chaîne, mais pas comme un nombre.
Je ne suis pas en utilisant le cadre de l'entité, donc je ne peux pas faire quelque chose comme:
where SqlFunctions.StringConvert((double)t.BillAmount).Trim() > 50
Je ne aussi aucun contrôle sur le schéma de base de données, donc je ne peux pas changer ces valeurs. Comment puis-je comparer le champ BillAmount à un nombre et renvoyer les valeurs ci-dessus / dessous?
La solution
You do not have to use Entity Framework to cast a String to Decimal.
You can simply use the Convert
call.
var x = from t in test
where Convert.ToDecimal(t.BillAmount) > 50
select t
or with Lambda expression:
var x = test.where(p=>Convert.ToDecimal(p.BillAmount) > 50);
Autres conseils
This is a good place to use let
, which will let you have a temporary variable as part of the LINQ query. Something like this should work:
from t in test
let amount = Convert.ToDecimal(t.BillAmount)
where amount > 50
select t