实体框架自定义字段

时间:2015-02-27 21:05:15

标签: asp.net-mvc entity-framework

我有一个SQL表,我通过包含两列的实体框架访问,一列用于成本价格,一列用于销售价格。我的表名为库存,因此我有一个名为库存的实体,包含两个属性 - costPrice和salePrice。

我想要的是第三列,它将计算两个字段之间的差异。另外,我想允许从视图中对三列中的任何一列进行排序。到目前为止我调查的一些选项如下:

向SQL表添加新列 - 我不允许在物理上执行此操作。

当我通过EF获取数据时,使用部分类扩展库存类并设置自定义字段 - 我不能这样做,因为这意味着我必须从表中获取所有500,000条记录,将它们放入列表中根据自定义字段执行此列表的排序,这将非常慢。

在视图中执行计算 - 这可用于显示数据,但我无法排序。

最后,创建一个SQL视图来保存三列,然后将SQL视图添加到EF。这很好,是我找到一个好解决方案的唯一方法。

我觉得在使用SQL视图时,必须有更现代的方法在EF中执行此操作? 任何想法或建议都会有很大帮助。

1 个答案:

答案 0 :(得分:0)

添加第三个属性(列到您的实体):

public Entity
{
    public int Prop1 {get;set;}
    public int Prop2 {get;set;}
    [NotMapped]
    public int Prop3 // New property
    {
        get
        {
            return Prop2 - Prop1; // or whatever
        }
    }
}

然后以这种方式从上下文中选择

db.Entities
    .Where(...)
    .Select(x => new { Blabla1 = x.Prop1, Blabla2 = x.Prop2, Blabla3 = (x.Prop2 - x.Prop1) }) // select what you need here + the difference. !ANONYMOUS TYPE!
    .OrderBy(x => x.Blabla3)
    .Select(x => new Entity { Prop1 = x.Blabla1, Prop2 = x.Blabla2 }) // !CONVERT TO THE TYPE YOU NEED!
    .ToList();

请注意,您可以在此处选择匿名类型。如果需要,您可以将其转换为最后一行所需的类型。