LINQ to SQL的自定义函数

时间:2018-10-08 03:47:55

标签: c# linq

我试图基于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()”方法,该方法不能转换为商店表达式。

1 个答案:

答案 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( … ); } }
 }