2010-10-21 111 views
5

我正在使用Enterprise Library.I想要将整列类型的列映射到枚举类型。C#Lambda表达式映射多个条件

Enum BloodGroup Type 
{ 

    OPositive, 
    ONegative, 
    ABPositive, 
    ABNegative, 
    BPositive, 
    BNegative, 
    NotSet 
} 

我映射数据库表的列C#类型的(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延伸的多个条件Method.I的意思是这样

.WithFun(rec=> rec.IsDBNull(rec.GetOrdinal("BloodGroup")) ? BloodGroup.NotSet 
       rec.GetOrdinal("BloodGroup")==1 ?BloodGroup.OPositive 
       rec.GetOrdinal("BloodGroup")==2 ?BloodGroup.ONegative 
     ) 

帮我检查多重条件?

+0

是NHibernate吗? – Aliostad 2010-10-21 20:30:52

+0

没有企业库5.0 – IExtensible 2010-10-21 20:32:56

回答

2
rec.IsDBNull(rec.GetOrdinal("BloodGroup")) ? BloodGroup.NotSet : 
rec.GetOrdinal("BloodGroup")==1 ? BloodGroup.OPositive : 
rec.GetOrdinal("BloodGroup")==2 ? BloodGroup.ONegative : 
BloodGroup.NotSet 

所有你需要添加的是一些冒号和最后的else表达式。请参阅ternary operator

+0

是的它工作正常 – IExtensible 2010-10-21 20:43:50

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中使用它。

+0

非常感谢你 – IExtensible 2010-10-21 20:44:35

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")))