我有一个SQL表,我通过包含两列的实体框架访问,一列用于成本价格,一列用于销售价格。我的表名为库存,因此我有一个名为库存的实体,包含两个属性 - costPrice和salePrice。
我想要的是第三列,它将计算两个字段之间的差异。另外,我想允许从视图中对三列中的任何一列进行排序。到目前为止我调查的一些选项如下:
向SQL表添加新列 - 我不允许在物理上执行此操作。
当我通过EF获取数据时,使用部分类扩展库存类并设置自定义字段 - 我不能这样做,因为这意味着我必须从表中获取所有500,000条记录,将它们放入列表中根据自定义字段执行此列表的排序,这将非常慢。
在视图中执行计算 - 这可用于显示数据,但我无法排序。
最后,创建一个SQL视图来保存三列,然后将SQL视图添加到EF。这很好,是我找到一个好解决方案的唯一方法。
我觉得在使用SQL视图时,必须有更现代的方法在EF中执行此操作? 任何想法或建议都会有很大帮助。
答案 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();
请注意,您可以在此处选择匿名类型。如果需要,您可以将其转换为最后一行所需的类型。