c# - EntityFramework - 选择具有自定义属性投影的实体

标签 c# entity-framework expression expression-trees

考虑以下实体:

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/

相关文章:

c# - C# 中的枚举类型约束

c# - 在配置中找不到提供程序或无效错误

大型应用程序的 C# 架构

linq - 如何将 IQueryable 对象创建的表达式的执行转移到 IEnumerable?

C语言优先顺序

c# - 如何将数据表表达式列中的值转换为2位小数

c# - 捆绑和缩小错误

c# - HiddenField.value 在 JS 中未定义

C# Asp.net Membership.GetAllUsers 通过电子邮件订购

c# - 检查实体是否实现接口(interface)并在通用存储库中添加谓词