2013-06-06 13 views
6

miałem nadzieję, że ktoś może mi pomóc zrozumieć dlaczego Convert.ToDecimal gdy używane w LINQ jest zaokrąglania po przecinku, a kiedy używany na zewnątrz, to nieDlaczego Convert.ToDecimal powracający różne wartości

Biorąc pod uwagę następujące DB:

CREATE TABLE [dbo].[Widgets](
    [ID] [int] NOT NULL, 
    [WidgetName] [varchar](50) NOT NULL, 
    [UnitsAvailable] [int] NOT NULL, 
    [WeightInGrams] [decimal](10, 6) NULL 
) ON [PRIMARY] 
GO 

INSERT [dbo].[Widgets] VALUES (1, N'Best thing ever', 100, CAST(10.000210 AS Decimal(10, 6))) 
INSERT [dbo].[Widgets] VALUES (2, N'Next Best thing', 50, CAST(100.000151 AS Decimal(10, 6))) 
INSERT [dbo].[Widgets] VALUES (3, N'The Other Model', 25, CAST(5.231651 AS Decimal(10, 6))) 

KOD:

class Program 
{ 
    static void Main(string[] args) 
    { 

     Console.WriteLine("------Example 1--------"); 

     LqToSqlDataContext _ctx = new LqToSqlDataContext(); 

     List<Widget> inventory = (from c in _ctx.linqWidgets 
            select new Widget() 
            { 
            Id = c.ID, 
            Name = c.WidgetName, 
            UnitsOnHand = c.UnitsAvailable, 
            WeightInGrams = Convert.ToDecimal(c.WeightInGrams) 
            }).ToList(); 

     foreach(Widget w in inventory) 
     { 
      Console.WriteLine(w.ToString()); 
     } 


     Console.WriteLine("------Example 2--------"); 

     var _linqInventory = _ctx.linqWidgets; 
     Widget temp = null; 

     foreach(linqWidget lw in _linqInventory) 
     { 
      temp = new Widget(); 
      temp.Id = lw.ID; 
      temp.Name = lw.WidgetName; 
      temp.UnitsOnHand = lw.UnitsAvailable; 
      temp.WeightInGrams = Convert.ToDecimal(lw.WeightInGrams); 

      Console.WriteLine(temp.ToString()); 
     } 



     Console.ReadLine(); 
    } 
} 

class Widget 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int UnitsOnHand { get; set; } 
    public decimal WeightInGrams { get; set; } 

    public override string ToString() 
    { 
     return this.Id + "\t" + this.Name + "\t" + this.UnitsOnHand + "\t" + this.WeightInGrams; 
    } 
} 

Wyjście

------Example 1-------- 
1  Best thing ever 100  10.0002 
2  Next Best thing 50  100.0002 
3  The Other Model 25  5.2317 
------Example 2-------- 
1  Best thing ever 100  10.000210 
2  Next Best thing 50  100.000151 
3  The Other Model 25  5.231651 

Odpowiedz

3

Ponieważ LinqToSql przekłada Convert.ToDecimal do instrukcji SQL jak CONVERT (dziesiętnie ({someNumberLinqComesupWith}, 4)

1

Ponieważ typ C# decimal nie jest taki sam jak typ decimal w bazie danych.

Jak widać, C# decimal jest dokładniejsze.

Powiązane problemy