3
public static MapFrom Map(this IDataReader idr, params string[] columns)
{
     return new MapFrom { Columns = columns };
}
public static IEnumerable<TEntity> To<TEntity>(this MapFrom from, Func<TEntity, object> map)
{
     // logic here.
}    

public IEnumerable<FooEntity> Execute()
{
    using (DbCommand cmd = db.GetStoredProcCommand("GetListOfFoo"))
    {
        using (IDataReader idr = db.ExecuteReader(cmd))
        {
            return idr.Map("FooID", "FooOfPooAmount", "AnotherFooColumn", "BarID")
              .To<FooEntity>(x => new object[]{
                          x.FooID, x.FooOfPooAmount, x.AnotherFoo, x.BarID
            });
         }
     }
}

我希望使用数据阅读器并创建一个易于使用且性能良好的简单映射器。我没有太多使用表达式树,但我觉得可能需要它们。我想要做的是检查 x 与其数组(lambda 表达式)的关系,然后使用这种关系自动适当地映射值并创建一个新的 Foo 实体列表。

MapFrom 只是一个容器,用于承载信息并允许流畅的扩展方法。

这些杂技的要点是有一种简单的方法来指定关系。我意识到我可以轻松地以不同的形式执行类似的操作,但我希望能够“流畅地”列出列 [1](如将列名键入为字符串,后跟逗号,然后是下一个列名),然后列出对象按顺序排列属性并从中推断映射。可以实现上面的To方法吗?表达式树在这里合适吗?我想我可以很容易地从 FooEntity 属性类型推断数据读取器字段的类型转换。

[1] 在这种情况下,我的意思不是像“Fluent API”中那样流利

4

1 回答 1

3

我在这里写了您的MapFrom类,而不是您必须编写代码将值从列复制到 FooEntity 实例的属性并使用该yield return语句返回您的实体集合,因此向MapFrom类添加另一个方法:

public class MapFrom
{
    private readonly IDictionary<string, string> columnMapDictionary =
        new Dictionary<string, string>();

    public MapFrom(string[] columns)
    {
        foreach (var column in columns)
        {
            columnMapDictionary.Add(column, null);
        }
    }

    public void To<T>(params Expression<Func<T, object>>[] properties)
    {
        var index = 0;
        foreach (var columnMap in columnMapDictionary.ToDictionary(k => k.Key))
        {
            var member = (properties[index++].Body as MemberExpression);
            var propertyName = member.Member.Name;
            columnMapDictionary[columnMap.Key] = propertyName;  
        }
    }
}

将其用作:

var mapper = new MapFrom("Name", "Surname");
mapper.To<FooEntity>(p => p.FirstName, p => p.LastName);
于 2012-06-01T21:58:47.887 回答