考虑以下实体:
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
属性和创建具有新值的实体模型实例?
我不希望实现-只有线索,如果有可能做与表达式树或应该寻找其他解决方案。
是的,您当然可以使用表达式树来做到这一点。我要做的是写一个从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()
的扩展方法中调用它。
与其每次将值四舍五入,不如将值四舍五入存储。您需要在OnModelCreating
函数中指定十进制四舍五入:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<Model>().Property(x => x.Value).HasPrecision(10, 8);
}