在LINQ to Entities中应用计算类型的策略

时间:2016-04-28 07:03:46

标签: c# entity-framework linq

我正在构建一个复杂的Linq查询,我遇到的问题是“LINQ to Entities中不支持指定的类型成员'JobRatio'。

在我的模型中,Jobs是一个IEnumerable:

Job具有以下计算属性:

public decimal JobRatio
{
    get
    {
        return TotalValueApprovedQuotes == 0 ? 0 : ((TotalValueApprovedQuotes - TotalWorkOrders) / TotalValueApprovedQuotes);
    }
}

当我尝试根据用户要求设置查询中的where子句时:

if (model.ShowJobRatio)
{
    jobs = jobs.Where(x => x.JobRatio < 0.3m);
}

我收到错误“LINQ to Entities中不支持指定的类型成员'JobRatio'

虽然我意识到我可以将我的IEnumerable更改为List以解决问题,但实际上我有许多这些计算出的属性需要通过,并且还不想运行查询。 (因为我还在构建Where子句)

一种选择是将此类型转换为预先计算的基本小数,有哪些策略可以解决这个问题?如果我要计算这个,我会在模型上这样做吗?或者当TotalValueApprovedQuotes,TotalWorkOrders或TotalValueApprovedQuotes发生变化时,在控制器中?

1 个答案:

答案 0 :(得分:1)

如果这是代码优先,您可以将计数器添加到计算属性,以使EF将其识别为持久字段。

public decimal JobRatio
{
    get { return ...; }
    set { }
}

执行此操作时,EF将在您编辑和保存实体时存储计算的值,但是无法在加载时填充该值,因此您始终拥有内存中的最新值。

但是,如果依赖项字段要在此控件之外更改,则持久值将不正确。

请注意,虽然它并不漂亮,但LINQ to Entities中接受了三元运算符(expr ? expr : expr),因此您可以使用计算代替x.JobRatio