我根据传递给它的枚举值进行了一些代码切换,然后执行数据库查询(通过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_Id
是int?
,ListPeople
的参数为Expression<Func<Person, bool>>
。
总共有3个枚举值,所以 不好,但即使只是进行心理练习,我也想知道我是否可以替换它转换语句更加花哨。
我想到了Dictionary<RegType, Expression<Func<something>>>
,但由于db谓词中的第一次使用与Max()
中的第二次使用不同,让我感到难过。
答案 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);