2010-02-24 3 views
0

J'ai une requête simple:Problème avec précision décimale dans SQL en utilisant LINQ to SQL

var results = from k in db.tree_nodes 
       join s in db.stocks 
       on k.tree_nodes_id equals s.tree_nodes_id 
       into tmpTable 
       from rowtmp in tmpTable.DefaultIfEmpty() 
       select new 
       { 
        stock = (rowtmp.amount == null) ? 
          ((k.code == null) ? (decimal?)null : (decimal?)0) 
          : 
          rowtmp.amount - rowtmp.amount_in_use, 
       }; 

Ceci est le code SQL généré:

SELECT 
    (CASE 
     WHEN ([t1].[amount]) IS NULL THEN 
      (CASE 
       WHEN [t0].[code] IS NULL THEN CONVERT(Decimal(33,4),NULL) 
       ELSE CONVERT(Decimal(33,4),0) 
      END) 
     ELSE CONVERT(Decimal(33,4),[t1].[amount] - [t1].[amount_in_use]) 
    END) AS [stock] 
FROM [dbo].[tree_nodes] AS [t0] 
LEFT OUTER JOIN [dbo].[stocks] AS [t1] ON [t0].[tree_nodes_id] = [t1].[tree_nodes_id] 

Le problème est, le générateur créé Decimal(33,4) lors de la conversion Les resultats. Donc, je reçois "123.4560" dans les résultats au lieu de "123.456" Tous mes champs dans cette requête sont decimal(14,3). Je ne me dérange pas le partie, mais je dois changer le , 4 à , 3. Comment puis-je faire ceci?

Répondre

1

Vous pouvez arrondir les valeurs décimales à 3 décimales?

var results = from k in db.tree_nodes 
       join s in db.stocks 
       on k.tree_nodes_id equals s.tree_nodes_id 
       into tmpTable 
       from rowtmp in tmpTable.DefaultIfEmpty() 
       select new 
       { 
        stock = (rowtmp.amount == null) ? 
          ((k.code == null) ? (decimal?)null : (decimal?)0) 
          : 
          decimal.Round(rowtmp.amount,3) - decimal.Round(rowtmp.amount_in_use == null ? 0 : rowtmp.amount_in_use,3), 
       }; 

Impossible de prévenir la conversion de type linq-to-sql.