为什么LINQ查询和扩展不支持转换或舍入数字?

时间:2017-02-10 03:02:51

标签: c# linq

我尝试围绕,格式化数字。但它似乎在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; }
    }

2 个答案:

答案 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确认。

归结起来的是,半数值会向偶数数字变化。