gpt4 book ai didi

c# - 从 IDataReader 映射时,我可以将 AutoMapper 配置为从自定义列名读取吗?

转载 作者:太空狗 更新时间:2023-10-29 23:35:06 24 4
gpt4 key购买 nike

映射配置的伪代码(如下所示)是不可能的,因为 lambda 只允许我们访问类型 IDataReader,而在实际映射时,AutoMapper 将到达每个 IDataRecord 的每个“单元格”,而 IDataReader.Read() == true:

var mappingConfig = Mapper.CreateMap<IDataReader, IEnumerable<MyDTO>>();
mappingConfig.ForMember(
destination => destination.???,
options => options.MapFrom(source => source.???));

谁能想出一种在运行时使用 AutoMapper 配置或仅满足以下要求的其他动态方法来执行此操作的方法。

要求是支持任何传入的 IDataReader,它的列名可能与 MyDTO 的属性名称不匹配,并且没有我可以依赖的命名约定.相反,我们将要求用户在运行时通过 IDataReader.GetSchemaTable() 交叉引用预期的列名称和在 IDataReader 中找到的实际列名称。

最佳答案

我不知道自动映射器,但我正在使用 ValueInjecter 将数据读取器映射到对象像这样:

 while (dr.Read())
{
var o = new User();
o.InjectFrom<DataReaderInjection>(dr);
return o;
}

和 DataReaderInjection(类似于 Automapper 的 ValueResolver)

public class DataReaderInjection : KnownSourceValueInjection<IDataReader>
{
protected override void Inject(IDataReader source, object target, PropertyDescriptorCollection targetProps)
{
for (var i = 0; i < source.FieldCount; i++)
{
var activeTarget = targetProps.GetByName(source.GetName(i), true);
if (activeTarget == null) continue;

var value = source.GetValue(i);
if (value == DBNull.Value) continue;

activeTarget.SetValue(target, value);
}
}
}

您可以使用它将值从 IDataReader 注入(inject)到任何类型的对象


ok,那么按照你的要求,我猜应该是这样的:

public class DataReaderInjection : KnownSourceValueInjection<IDataReader>
{
protected override void Inject(IDataReader source, object target, PropertyDescriptorCollection targetProps)
{
var columns = source.GetSchemaTable().Columns;
for (var i = 0; i < columns.Count; i++)
{
var c = columns[i];

var targetPropName = c.ColumnName; //default is the same as columnName

if (c.ColumnName == "Foo") targetPropName = "TheTargetPropForFoo";
if (c.ColumnName == "Bar") targetPropName = "TheTargetPropForBar";
//you could also create a dictionary and use it here

var targetProp = targetProps.GetByName(targetPropName);
//go to next column if there is no such property in the target object
if (targetProp == null) continue;

targetProp.SetValue(target, columns[c.ColumnName]);
}
}
}

这里我使用了 GetSchemaTable,就像你想要的那样:)


好的,如果你想将一些东西传递给注入(inject),你可以通过多种方式实现,方法如下:

o.InjectFrom(new DataReaderInjection(stuff), dr);
//you need a constructor with parameters for the DataReaderInjection in this case

var ri = new DataReaderInjection();
ri.Stuff = stuff;
o.InjectFrom(ri, dr);
//you need to add a property in this case

这里有一个提示(对于带参数方式的构造函数)

  public class DataReaderInjection : KnownSourceValueInjection<IDataReader>
{
private IDictionary<string, string> stuff;
public DataReaderInjection(IDictionary<string,string> stuff)
{
this.stuff = stuff;
}
protected override void Inject(
...

关于c# - 从 IDataReader 映射时,我可以将 AutoMapper 配置为从自定义列名读取吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3061369/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com