LINQ - ToString(“N2”)无例外地失败?

时间:2012-01-20 10:16:50

标签: c# linq linq-to-sql

下面的LINQ查询在没有.ToString("N2")部分的情况下工作正常。使用.ToString()也可以正常工作。添加("N2")而不是()时,如果没有引发任何异常,则返回任何内容。为什么呢?

解决方法问题:在没有格式化的情况下打印FundFee数字时,它们将打印为9.00000000e-3。这仅在LINQ查询中发生,CurrentCultureen-US。有什么方法可以将其改为非电子符号吗?然后一个解决方法可能是使用.ToString().SubString(0,4),因为所有数字都在0和1之间。

欢迎任何其他改进意见:)

List<FundStairItem> listFunds = (from fundInfoISIN in amdw.FundsInfos.Where(f => f.Type == 1)
                                 from fundInfoName in amdw.FundsInfos.Where(f =>f.Type == 2)
                                 from fundFee in amdw.FundFees
                                 from securities in amdw.Securities                                                 
                                 where securities.ISIN == fundInfoISIN.Value && fundInfoISIN.Value != null && fundInfoISIN.PortfolioId == fundInfoName.PortfolioId && fundFee.ISIN == securities.ISIN
                                            select new FundStairItem
                                            {
                                                Key = fundInfoISIN.Id,
                                                Name = (fundInfoName.Value != "" && fundInfoISIN.Value != "") ? fundInfoName.Value 
                                                    + " " + fundFee.Class.Trim() + " ( Fee: " + (fundFee.Fee*100).ToString("N2") + "% , ISIN:" +fundInfoISIN.Value +")" : securities.Name
                                            }).GroupBy(p=>p.Key).Select(g=>g.First()).ToList();

修改(添加评论信息):

在查询之前添加此项:amdw.Log = Console.Out给出输出:控制台中System.Data.Linq.dll中出现“System.NotSupportedException”类型的第一次机会异常。 < / p>

1 个答案:

答案 0 :(得分:1)

LINQ to SQL无法将格式字符串转换为T-SQL。

不是依靠SQL Server格式化字符串,而是将所需的所有数据提取到内存中,并将数据从那里投影到正确的格式。

一个简单的,虚构的例子:

// Don't - LtS tries to translate format string to T-SQL
var formattedFundFeess = from fund in Context.Funds
                         select fund.Fee.ToString("N2");

// Do - fetch your fees into memory and let .NET do the format
var fundFeesInMemory = (from fund in Context.Funds
                        select fund.Fee).ToList();

var formattedFundFees = from fundFee in fundFeesInMemory 
                        select fundFee.ToString("N2");