在数据库中,我有一个包含逗号分隔值的列,如下所示:
Foo.Bars varchar(100): @;1,5
在代码中,DTO 包含一个 List<string>,如下所示:
public class Foo { public List<string> Bars {get; set;} }
我希望PetaPoco为我进行转换。
我已经阅读了有关该IMapper
界面的信息,但找不到有关如何使用它的示例。
我怎样才能达到预期的效果?
这是我认为的解决方案:
public class ListMapper : IMapper
{
public void GetTableInfo(Type t, TableInfo ti)
{
}
public bool MapPropertyToColumn(PropertyInfo pi, ref string columnName, ref bool resultColumn)
{
return true;
}
public Func<object, object> GetFromDbConverter(PropertyInfo pi, Type sourceType)
{
return src =>
{
if (sourceType == typeof (string)
&& pi.PropertyType == typeof (List<string>)
&& src != null)
{
return ((string) src).Split(';').ToList();
}
return src;
};
}
public Func<object, object> GetToDbConverter(Type sourceType)
{
return null;
}
}
Database.Mapper = new ListMapper(); // Mapper is a static property
如果逗号分隔的字符串在您的数据库中很常见,那么实施IMapper
可能是您的最佳选择。但是,如果这仅在您的架构中发生一次,则执行以下操作可能更简单且更易于维护:
[PetaPoco.Column("Bars")]
public string BarCsvString { get; set; }
[PetaPoco.Ignore]
public IEnumerable<string> Bars { get { return BarCsvString.Split(","); } }
(注意 - 我很确定PetaPoco.Ignore
是在只读属性上假设的。)