考虑以下实体:

public class Model
{
    public int Id { get; set; }
    public decimal Value { get;  set; }
}


我想在分配给模型实例之前四舍五入任何decimal值。我可以这样做:

dbContext.Models
             .Select(model => new
                    {
                      Id = model.Id,
                      Value = Math.Round(model.Value, 10)
                    }
             .ToList()
             .Select(anonymous =>
                          new Model
                              {
                                Id = anonymous.Id
                                Value = anonymous.Value
                              });


它工作正常,但是我有一个包含100多个列的实体。是否可以构建自动迭代阈值属性并在Math.Round属性上调用decimal并使用新值创建实体模型实例的投影?

我不希望实现-仅在可能的情况下使用expresion tree或应该寻找其他解决方案。

最佳答案

是的,您当然可以使用表达式树来做到这一点。我要做的是编写一个从ExpressionVisitor继承的类,重写其VisitMember()方法,并在其中检查decimal属性。当您检测到decimal属性时,返回包装在Math.Round()中的该属性。

最终结果应该正是您想要的结果:一个类似model => new { Id = model.Id, Value = model.Value }的lambda表达式将被转换为model => new { Id = model.Id, Value = Math.Round(model.Value, 10) }。然后,您可以从名为SelectRounded()之类的扩展方法中调用此方法。

09-30 21:45
查看更多