0

是否可以首先在 EF 代码中创建一个可以使用其自己表的其他元素的计算属性?

如果不是,那么不使用上下文方法的最佳方法是什么(我想要一个属性将其绑定到 wpf UI 上而不使用转换器)?

这个例子显示了我正在尝试做的事情(在计算的 sql 字段中很容易做到):

class MyEntity{

public virtual decimal Amount { get; set; }

public virtual decimal DivideOfThisAmountOnAll
{
    get
      {
        var sum = *******.sum(e=>e.Amount); //How am i supposed to acces to the others?
        return this.Amount / sum;
      }
 }

}
4

3 回答 3

2

我建议不要直接修改您的数据库对象,而是为绑定创建一个业务逻辑层。https://github.com/AutoMapper/AutoMapper之类的工具可以让您轻松传输大部分表实体而无需修改,然后执行创建汇总值、复杂计算字段和其他非存储数据任务等操作。

在 MVC 中,这称为 Model、View、ViewModel、Controller,其中 ViewModel 是您绑定的对象并具有所有计算结果。

这确实引入了额外的复杂性,但它让您的模型对象单独存在(这是一件好事),并允许您将规则隔离到一个位置(ViewModel),这可以避免将相同的计算传播到许多控制器(这是一种反图案)。

于 2013-03-06T18:11:33.457 回答
1

如果不访问 db 上下文,您将无法执行此操作。您可以提出一些方案,将其注入实体等,但基本上您将像查询任何其他查询一样查询数据库上下文。

class MyEntity{
  public virtual decimal Amount { get; set; }

  public virtual decimal DivideOfThisAmountOnAll(YourDbContext db)
  {  
        var sum = db.LinqQueryHereToAggregateAsYouPlease.Single();
        return this.Amount / sum;
  }

}
于 2013-03-06T18:13:13.873 回答
1

我建议使用导航属性来执行此操作。

class MyEntity{

    public virtual decimal Amount { get; set; }

    public virtual Parent Parent { get; set; }

    public virtual decimal DivideOfThisAmountOnAll
    {
        get
        {
            var sum = Parent.MyEntities.Sum(e=> e.Amount);
            return this.Amount / sum;
        }
    }

}

AaronLS 的答案也很好,但它引入了对 DbContext 的依赖(如果你关心这些事情)。

于 2013-03-06T22:30:07.637 回答