2014-02-08 128 views
3

我發現了下面的錯誤在使用DTO和EF模型:如何解決 - 無法使用Automapper將Generic.List轉換爲Linq.IQueryable?

無法轉換 類型的對象「System.Collections.Generic.List 1[Project.Core.UI.Models.ContentTypes]' to type 'System.Linq.IQueryable 1 [Project.Core.UI.Models.ContentTypes ]

自舉:Mapper.CreateMap<ContentType, Project.Core.UI.Models.ContentTypes>();

在一個OData的控制器的方法public IQueryable<ContentTypes> Get() {...},使用:

var result = Mapper.Map<IQueryable<ContentType>, IQueryable<ContentTypes>>(_repository.Query().Get() 
    .Where(u => u.UserId == userId) 
    .OrderBy(o => o.Description)); 

我也曾嘗試以下,但我懷疑這正是上面是還有:

var result =_repository.Query().Get() 
    .Where(u => u.UserId == userId) 
    .OrderBy(o => o.Description); 
var dto = Mapper.Map<IQueryable<ContentType>, IQueryable<ContentTypes>>(result); 
return dto; 

我怎樣才能創建此相應的映射?

回答

4

您需要通過這樣的方式創建的映射是知道的事實:

Mapper.CreateMap<ContentType, Project.Core.UI.Models.ContentTypes>(); 

只有這些基本的泛型集合類型隱含支持:

IEnumerable 
IEnumerable<T> 
ICollection 
ICollection<T> 
IList 
IList<T> 
List<T> 
Arrays 

但不是IQueryable<T>。這就是爲什麼你會得到例外。

因此,你應該嘗試做某事像這樣:

var dto = Mapper.Map 
     <IEnumerable<ContentType>, 
      IEnumerable<ContentTypes>>(result.AsEnumerable()); 
// or e.g. List/List/ToList() 
+0

謝謝。這適用於我! –

2

除了什麼bejger說,你也可以使用QueryableExtensions命名空間中Automapper映射IQueryable的對象,但是卻讓一些limitations了安裝程序,你可以兩個Object之間做的時候,你做你CreateMap<TSource, TDest>

,而不是使用它像

IQueryable<ContentTypes> dto = Mapper.Map<IQueryable<ContentType>, IQueryable<ContentTypes>>(result); 

你改爲使用它像

IQueryable<ContentTypes> dto = result.Project().To<ContentTypes>(); 
+0

在這種情況下'Project()'來自哪裏?結果沒有任何參考。 – ElHaix

+0

要同時使用'Project()'和'To ()',您需要在文件的頂部添加'使用AutoMapper.QueryableExtensions;'。 [它包含在Automapper中](https://github.com/AutoMapper/AutoMapper/blob/develop/src/AutoMapper/QueryableExtensions.cs) –

相關問題