如何替换表达式的switch语句

时间:2017-08-07 09:06:29

标签: c#

我根据传递给它的枚举值进行了一些代码切换,然后执行数据库查询(通过EF)

switch(regtype)
{
    case RegType.Type1:
        return (Dc.ListPeople(n => n.RegistrationType1Id != null)
        .DefaultIfEmpty()
        .Max(n => n.RegistrationType1Id ) ?? 0) + 1;
    case RegType.Type2:
        return (Dc.ListPeople(n => n.RegistrationType2Id != null)
        .DefaultIfEmpty()
        .Max(n => n.RegistrationType2Id ) ?? 0) + 1;
...
}

现在数据模型就是这样,让我们​​看看它。 RegistrationType_N_Idint?ListPeople的参数为Expression<Func<Person, bool>>

总共有3个枚举值,所以 不好,但即使只是进行心理练习,我也想知道我是否可以替换它转换语句更加花哨。

我想到了Dictionary<RegType, Expression<Func<something>>>,但由于db谓词中的第一次使用与Max()中的第二次使用不同,让我感到难过。

1 个答案:

答案 0 :(得分:3)

您可以创建一个单独的方法,将属性选择器作为参数。实体框架不能直接处理代理,因为它必须将代码转换为SQL,因此有必要处理表达式树。

public int M(Expression<Func<Person, int?>> selector)
{
    var expr = Expression.NotEqual(selector.Body, Expression.Constant(null, typeof(object)));
    var lambda = Expression.Lambda<Func<Person, bool>>(expr, selector.Parameters);

    return (Dc.ListPeople(lambda)
    .DefaultIfEmpty()
    .Max(selector)) ?? 0) + 1;
}

用法:

switch(regtype)
{
    case RegType.Type1:
        return M(x => x.RegistrationType1Id);