在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个小数的字符串。
示例:
如果我为StringConvert
使用其他参数,即
SqlFunctions.StringConvert(myTable.Number, 9, 2)
结果也不正确:
StringConvert()
函数被转换为SQL Server函数STR
。
https://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查询中格式化数字?
答案 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") });