考虑以下实体:
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 列的实体。是否可以构建自动遍历属性并在 decimal
属性上调用 Math.Round
并创建具有新值的实体模型实例的投影?
我不想实现 - 仅提供是否可以使用表达式树执行此操作的线索,或者应该寻找其他解决方案。
最佳答案
是的,您当然可以使用表达式树来做到这一点。我要做的是编写一个继承自 ExpressionVisitor
的类, 覆盖它的 VisitMember()
方法并在那里检查 decimal
属性。当您检测到 decimal
属性时,返回包装在 Math.Round()
中的该属性。
最终结果应该正是您想要的:像 model => new { Id = model.Id, Value = model.Value }
这样的 lambda 表达式将被转换为 model = > 新的 { Id = model.Id, Value = Math.Round(model.Value, 10) }
。然后,您可以从名为 SelectRounded()
的扩展方法中调用它。
关于c# - EntityFramework - 选择具有自定义属性投影的实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25162128/