C# PetaPoco将逗号分隔的字符串映射到字符串列表

C# PetaPoco将逗号分隔的字符串映射到字符串列表,c#,.net,orm,petapoco,micro-orm,C#,.net,Orm,Petapoco,Micro Orm,在数据库中,我有一个列,其中包含逗号分隔的值,如下所示: Foo.Bars varchar(100): @;1,5 public class Foo { public List<string> Bars {get; set;} } 在代码中,DTO包含一个列表,如下所示: Foo.Bars varchar(100): @;1,5 public class Foo { public List<string> Bars {get; set;} } public类Foo

在数据库中,我有一个,其中包含逗号分隔的值,如下所示:

Foo.Bars varchar(100): @;1,5
public class Foo { public List<string> Bars {get; set;} }
在代码中,DTO包含一个列表,如下所示:

Foo.Bars varchar(100): @;1,5
public class Foo { public List<string> Bars {get; set;} }
public类Foo{public List bar{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;
    }
}

以下是我认为的解决方案:

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;
    }
}

如果逗号分隔字符串在数据库中很常见,那么实现
IMapper
可能是最好的选择。但是,如果这种情况在模式中只发生一次,那么这样做可能更简单,也更易于维护:

[PetaPoco.Column("Bars")]
public string BarCsvString { get; set; }

[PetaPoco.Ignore]
public IEnumerable<string> Bars { get { return BarCsvString.Split(","); } }
[PetaPoco.列(“条”)]
公共字符串BarCsvString{get;set;}
[PetaPoco.忽略]
公共IEnumerable条{get{return BarCsvString.Split(“,”;}}

(注意-我非常确定只读属性上假定使用
PetaPoco.Ignore

如果数据库中常见逗号分隔字符串,那么实现
IMapper
可能是最好的选择。但是,如果这种情况在模式中只发生一次,那么这样做可能更简单,也更易于维护:

[PetaPoco.Column("Bars")]
public string BarCsvString { get; set; }

[PetaPoco.Ignore]
public IEnumerable<string> Bars { get { return BarCsvString.Split(","); } }
[PetaPoco.列(“条”)]
公共字符串BarCsvString{get;set;}
[PetaPoco.忽略]
公共IEnumerable条{get{return BarCsvString.Split(“,”;}}

(注意-我非常确定,
PetaPoco.Ignore
假设为只读属性。)

我对
PetaPoco
一无所知,但从源代码来看,您需要实现
IMapper
接口,并特别注意
GetFromDbConverter
,然后您将在
数据库
对象上设置映射器。我对
PetaPoco
一无所知,但从源代码来看,您需要实现
IMapper
接口,并特别注意
GetFromDbConverter
,然后在
数据库
对象上设置映射器。这是我考虑的第一件事,但我的Foo对象不再是DTO(它现在实现了逻辑),整个程序集对PetaPoco有一个硬依赖关系。这是我考虑的第一件事,但我的Foo对象不再是DTO(它现在实现了逻辑)整个程序集对PetaPoco有着严格的依赖关系。