如何在Entity Framework LINQ中格式化数字(不带尾随零)?

时间:2018-09-30 15:03:23

标签: entity-framework linq linq-to-sql

在SQL Server数据库中,我定义了decimal数据类型的列,如下所示:

CREATE TABLE MyTable
(
    Id INT,
    Number DECIMAL(9, 4)
)

我使用Entity Framework,并且我想将转换为字符串的列Number返回为仅包含实际需要的小数点分隔符的数字的字符串。严格的约束是结果必须为IQueryable

所以我的查询是:

IQueryable queryable = (
            from myTable in MyDatabase.NyTable
            select new
            {
                Id = myTable.Id,
                Number = SqlFunctions.StringConvert(myTable.Number,9,4)
            }
);

问题在于,即使数字为0,也总是将数字转换为带有4个小数的字符串。

示例:

  • 3转换为“ 3.0000”
  • 1.2转换为“ 1.2000”

如果我为StringConvert使用其他参数,即

SqlFunctions.StringConvert(myTable.Number, 9, 2)

结果也不正确:

  • 0.375舍入为0.38。

StringConvert()函数被转换为SQL Server函数STRhttps://docs.microsoft.com/en-us/sql/t-sql/functions/str-transact-sql?view=sql-server-2017

这解释了奇怪的结果。

在Entity Framework和LINQ领域,我找不到可行的解决方案。

我要找的是C#函数

String.Format("0.####", number)

但是不能在LINQ查询中使用。

在简单的SQL中,我可以这样编写查询

SELECT
    Id,
    Number = CAST(CAST(Number AS REAL) AS VARCHAR(15))
FROM
    MyTable

我没有设法使LINQ产生这样的查询。

一种解决方法是忘记在LINQ中执行此操作,这是非常僵化和混乱的事情,无用的边界,只是从数据库返回类型DECIMAL,并在显示之前在客户端进行格式化。但这是额外的,不必要的代码,如果通过LINQ有更简单的方法,我将不愿采用这种方式。

是否可以在LINQ查询中格式化数字?

1 个答案:

答案 0 :(得分:1)

我绝对会从他的数据库中返回一个小数,并在需要时对其进行格式化。查询后直接可能。但通常是在显示时完成此操作,以考虑到客户端的区域性特定格式。

var q = 
    (from myTable in MyDatabase.NyTable
    select new
    {
        Id = myTable.Id,
        Number = myTable.Number
    })
    .AsEnumerable()
    .Select(x => new { Id = x.Id, Number = x.Number.ToString("G29") });