考虑以下实体:
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()
之类的扩展方法中调用此方法。