我正在使用Enterprise Library。我想将列(整数类型)映射到Enum Type。
说
Enum BloodGroup Type
{
OPositive,
ONegative,
ABPositive,
ABNegative,
BPositive,
BNegative,
NotSet
}
我将Database Table的列映射到C#Types(Class Employee)属性。
IRowMapper<Employee> addressMapper = MapBuilder<Employee>
.MapAllProperties() // map all properties
.Map(p=>p.BloodGroup) // override BloodGroup property
.WithFunc(rec => rec.IsDBNull(rec.GetOrdinal("BloodGroup"))
? BloodGroup.NotSet
: BloodGroup.OPositive)
.Build();
代码工作正常,但我想在WithFun
扩展方法中映射枚举的多个条件。我的意思是
.WithFun(rec=> rec.IsDBNull(rec.GetOrdinal("BloodGroup")) ? BloodGroup.NotSet
rec.GetOrdinal("BloodGroup")==1 ?BloodGroup.OPositive
rec.GetOrdinal("BloodGroup")==2 ?BloodGroup.ONegative
)
帮我核对多种情况?
答案 0 :(得分:2)
rec.IsDBNull(rec.GetOrdinal("BloodGroup")) ? BloodGroup.NotSet :
rec.GetOrdinal("BloodGroup")==1 ? BloodGroup.OPositive :
rec.GetOrdinal("BloodGroup")==2 ? BloodGroup.ONegative :
BloodGroup.NotSet
您需要添加的是一些冒号和最后的其他表达式。请参阅ternary operator。
答案 1 :(得分:1)
使用
.WithFunc((rec) => {
if(rec.IsDBNull(rec.GetOrdinal("BloodGroup"))
return BloodGroup.NotSet;
else if(rec.GetOrdinal("BloodGroup")==1)
return BloodGroup.OPositive;
else if(rec.GetOrdinal("BloodGroup")==2)
return BloodGroup.ONegative;
..... // you get the idea
})
. // rest
基本上你可以使用花括号来定义你的功能。或者,您可以创建一个函数并在Func
中使用它。
答案 2 :(得分:1)
尝试这样的事情。使用此代码,您可以创建一个匿名函数,只需触摸一次记录,从而提高全面效率。如果您熟悉lambda强制转换和调用,它也更容易阅读。将此lambda抽象为一般的int-to-Enum函数将是最佳的。
.WithFun(rec => ((Func<BloodGroup, int>)
(i =>
{
if(rec.IsDBNull(i)) return BloodGroup.NotSet;
switch(i)
{
case 1:
return BloodGroup.OPositive;
case 2:
return BloodGroup.ONegative;
// More cases...
default:
return BloodGroup.NotSet;
}
})).Invoke(rec.GetOrdinal("BloodGroup")))