我试图基于linq to SQL IQueryable Entity的一些阈值变量来计算状态。
我的实体 包含两个属性
Expression<Func<EntityModel, string>> GetSeverity(EntityModel entity)
{
var fraction = (double)entity.Value / (double)entity.Threshold;
var red = nameof(Severity.Red);
var amber = nameof(Severity.Amber);
var green = nameof(Severity.Green);
if (fraction > 1)
{
return t => red;
}
if (fraction >= 0.75 && fraction < 1)
{
return t => amber;
}
return t => green;
}
现在我要使用自动映射器进行投影的其他属性。本质上
“响应”具有一个属性,该属性吸收“阈值”和“值”来计算“状态”。
我最终写了一个自定义的Expression Func。
CreateMap<EntityModel, ResponseModel>()
.ForMember(d => d.Severity,e => e.MapFrom(d => GetSeverity(d)));
严重性只是一个枚举。
现在也许我对func表达式的用法不正确
{{1}}
我最终得到了例外
LINQ to Entities无法识别该方法 “ System.String ToString()”方法,该方法不能转换为商店表达式。
答案 0 :(得分:0)
为什么这必须是映射函数?为什么不提取所需的值,然后在运行时根据需要将其投影为一个实体?如(伪代码)
var currentValues =
MyTable.GetValues()
.ToList() // Gets the values from the db and makes them IEnumerable
.Select(itm => new {
Status = DetermineStatus( … ), // "Red" | "Yellow" ...
itm
}
)
.ToList();
...
private string DetermineStatus(...variables here....);
或者更好地在模型中定义一个带有新属性的部分类,该新属性将状态作为计算所得的属性返回?
partial class MyDBItem
{
public string Status { get { return DetermineStatus( … ); } }
}