我尝试围绕,格式化数字。但它似乎在LINQ中不起作用。我需要格式化,并将数字四舍五入作为您的参考。谢谢你的帮助。我得到的例外。
LINQ to Entities无法识别方法''方法,并且此方法无法转换为商店表达式。
匿名类型对于将非十进制数和格式舍入为逗号分隔非常重要:
B - 1000.5该值必须为1,001 C - 1000.2的值必须为1,000 D - 1080.588的值必须为1,081 E - 1010.45值必须为1,000
这是我的代码:
var result = _context.DwPropertyMasters.Where(x => x.ShowMapPoint == "Y")
.Select(x => new
{
x.LandId,
a = x.Development == null || x.Development == "" ? x.Location : x.Development,
x.MapPointX,
x.MapPointY,
AreaSize = x.AreaSize ?? 0,
Premium = x.Premium ?? 0,
b = (x.Premium == 0 ? null : x.Premium) * 100000000 / (x.AreaSize == 0 ? null : x.AreaSize) ?? 0,
c =
_context.DwPropertyDetails.Where(
z => (z.TransactionPrice > 0 || z.TransactionPrice != null) && z.LandId == x.LandId)
.GroupBy(z => z.LandId)
.Select(g =>
(g.Sum(p => p.TransactionPrice) == 0 ? null : g.Sum(p => p.TransactionPrice)) /
(g.Sum(p => p.ActualSize) == 0 ? null : g.Sum(p => p.ActualSize)) ?? 0)
.FirstOrDefault(),
d =
((x.AreaSize2 == 0 ? null : x.AreaSize2) == 0
? 0
: (x.Premium == 0 ? null : x.Premium) * 100000000 / (x.AreaSize2 == 0 ? null : x.AreaSize2)) ??
0,
x.LandType,
e =
_context.DwPropertyDetails.Where(
y => (y.TransactionPrice > 0 || y.TransactionPrice != null) && y.LandId == x.LandId)
.Select(y => new
{
a = 1
}).Count()
});
这是ViewModel:
var output = result.Select(x => new SearchViewModels
{
LandId = x.LandId,
A = x.a,
MapPointX = x.MapPointX,
MapPointY = x.MapPointY,
AreaSize = x.AreaSize,
Premium = x.Premium,
B = x.b,
C = x.c,
D = x.d,
LandType = x.LandType,
E = x.e
}).ToArray();
这是ViewModel类:
public class SearchViewModels
{
public long LandId { get; set; }
public string A { get; set; }
public string MapPointX { get; set; }
public string MapPointY { get; set; }
public long? AreaSize { get; set; }
public long? Premium { get; set; }
public long? B { get; set; }
public long? C { get; set; }
public long? D { get; set; }
public string LandType { get; set; }
public long? E { get; set; }
}
答案 0 :(得分:0)
如果您需要捕获精确的十进制值,请使用decimal
(或decimal?
,如果它必须可为空)数据类型,而不是long
(您也不应使用{{1}或者float
,因为它听起来像是在处理需要更高精度的数字)。您的B / C / D / E值应为double
s。
答案 1 :(得分:0)
这很可能是由于Decimal的默认舍入模式,后面是IEEE Standard 754,第4.1节说明(部分):
本标准的实施应提供最接近的圆形 默认舍入模式。在此模式下,可表示的值最接近 应提供无限精确的结果;如果两个最近的可表示 值同样接近,具有最低有效位的值应为 递送
这已在Microsoft的Math.Round
reference page确认。
归结起来的是,半数值会向偶数数字变化。