2012-06-01 45 views
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 Entiti列表。使用表達式樹進行映射?有沒有可能實現這一點?

MapFrom只是一個攜帶信息並允許流暢的擴展方法的容器。

這些雜技的要點是有一個簡單的方法來指定關係。我意識到我可以輕鬆地以不同的形式做類似的事情,但我希望能夠「流利地」列出列[1](例如,在列名中輸入字符串,然後輸入逗號和下一列名),然後列出對象按順序排列屬性並從中推斷映射。它有可能實現上面的方法?表達式樹在這裏適合嗎?我想我可以很容易地推斷從FooEntity屬性類型的數據閱讀器字段的類型轉換。

[1]在這方面,我的意思並不是說流利如「流利的API」

+0

爲什麼你想重新發明輪子? :) 你開始寫一個ORM,這不是一個好主意。 –

+1

我熟悉的ORM太重了。我想要的東西重量輕,接近於手動滾動 - 只是冗餘和不必要的噪音消除。我見過的ORM有不受歡迎的約束 - 性能,與C#邏輯混合的SQL等等。 –

回答

2

我在這裏寫下你的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);