选择具有自定义属性投影的实体



考虑以下实体:

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);
}

最新更新