我正在构建一个复杂的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发生变化时,在控制器中?
答案 0 :(得分:1)
如果这是代码优先,您可以将计数器添加到计算属性,以使EF将其识别为持久字段。
public decimal JobRatio
{
get { return ...; }
set { }
}
执行此操作时,EF将在您编辑和保存实体时存储计算的值,但是无法在加载时填充该值,因此您始终拥有内存中的最新值。
但是,如果依赖项字段要在此控件之外更改,则持久值将不正确。
请注意,虽然它并不漂亮,但LINQ to Entities中接受了三元运算符(expr ? expr : expr
),因此您可以使用计算代替x.JobRatio
。