2011-12-14 48 views
0

因此我發現了一些關於automapper從映射返回0列表的問題(例如:Automapper mapping list becomes 0),但沒有一個看起來與我正在看到的完全相同。Automapper從列表映射返回0的計數?

我有兩種類型:

public class DNSContract : BaseContract 
{ 
    public int DoNotSolicitID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Address1 { get; set; } 
    public string Address2 { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string Zip { get; set; } 
    public string Zip4 { get; set; } 
    public string Email { get; set; } 
    public string Phone { get; set; } 
    public string BusinessName { get; set; } 
    public string Partner { get; set; } 
    public string Origination { get; set; } 
} 

public DNS_Entity() 
    { 
     // set default values which can be expicity set if needed 
     InsertDT = DateTime.Now; 
     InsertDT = DateTime.Now; 
     // InsertUserID = 999; 
     Origination = "RDI"; 
    } 

    public long DoNotSolicitID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Address1 { get; set; } 
    public string Address2 { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 
    public string Zip { get; set; } 
    public string Zip4 { get; set; } 
    public string Email { get; set; } 
    public string Phone { get; set; } 
    public string BusinessName { get; set; } 
    public string Partner { get; set; } 
    public string Origination { get; set; } 
    public Nullable<System.DateTime> InsertDT { get; set; } 
    //public int InsertUserID { get; set; } 
    public DateTime? UpdateDT { get; set; } 
    //public int UpdateUserID { get; set; } 
} 

很容易出現。這裏有一個我正在使用的「快速地圖」方法:

public static TToType QuickMap<TFromType, TToType>(this TFromType fromObject, TToType toObject) 
     where TFromType : class 
     where TToType : class, new() 
    { 
     // Look for an existing map, and if none is found add one. 
     if (Mapper.FindTypeMapFor(typeof (TFromType), typeof (TToType)) == null) 
     { 
      Mapper.CreateMap(typeof (TFromType), typeof (TToType)); 
     } 

     // Execute the auto map 
     TToType map = Mapper.Map(fromObject, toObject); 

     return map; 
    } 

到目前爲止這麼好我猜。但是,

TToType map = Mapper.Map(fromObject, toObject); 

什麼都不做。問題是,這種代碼返回一個空DNSContract時,它應該返回4(從我的單元測試):

using (var scope = dnsWork) 
     { 
      scope.Register(this); 

      var one = WhereInternal(whereClause); 
      var two = one.ToList(); 
      var three = two.QuickMap(new List<DNSContract>()); 
      return three; 
      //return WhereInternal(whereClause).ToList().QuickMap(new List<DNSContract>()); 
     } 

我已經打破了呼叫分爲一,二,三層爲理智的緣故,而調試此。所以基本上,我有一個列表,並希望返回一個列表,這是失敗的。

的東西做的工作是:

return Mapper.Map(two, new List<DNSContract>()); 

,但我想使用泛型方法,而不必在整個業務層映射灑。

有了automapper,我需要做任何特殊的列表映射嗎?我認爲這是我的映射類型的問題,但由於某種原因,typeB的列表工作不正常。

謝謝。這讓我煩惱了幾個星期,有點忽略它,但我需要解決的是儘快。

更新#1:按照要求,下面是同類產品的一個片段是在我的DAL和實體框架拉WhereInternal方法:

public abstract class EFRepository<T> : IRepository<T> where T : BaseEntity 
{ 
    public IUnitOfWork UnitOfWork { get; set; } 

    private IDbSet<T> _objectset; 

    private IDbSet<T> ObjectSet 
    { 
     get { return _objectset ?? (_objectset = UnitOfWork.Context.Set<T>()); } 
    } 

    public IQueryable<T> WhereInternal(Expression<Func<T, bool>> expression) 
    { 
     return ObjectSet.Where(expression); 
    } 
} 

我不認爲這是非常重要的在上下文中,因爲我轉換爲列表然後嘗試映射。

+0

請提交什麼WhereInternal(whereClause)回報 - 我懷疑的IEnumerable ? – 2011-12-14 16:15:44

回答

2

首先,在實現QuickMap方法時存在一個問題 - 我不確定爲什麼你希望第二個參數被傳遞,如果你實際上只需要一個類型它。你也不會調用最直接的方法來執行映射。

其次,根據documentation,只註冊一個映射簡單類型,因此我會分開註冊和映射本身。 這裏是我想出了:

static class MapperHelper 
{  
    static void Register<TSource, TDestination>() 
    { 
     var mapped = Mapper.FindTypeMapFor(typeof(TSource), typeof(TDestination)); 
     if (mapped == null) 
     { 
      var expression = Mapper.CreateMap<TSource, TDestination>(); 
     } 
    } 
    static TDestination QuickMap<TSource, TDestination>(this TSource source) 
    { 
     return Mapper.Map<TSource, TDestination>(source); 
    } 
} 

和使用:

//Registration 
MapperHelper.Register<DNS_Entity, DNSContract>(); 
//Mapping 
var result = WhereInternal(whereClause).ToList().QuickMap<IList<DNS_Entity>, IList<DNSContract>>(); 
+0

完全正確,非常感謝。 – BryanGrimes 2011-12-14 20:58:25