2012-04-02 13 views
0

AutoMapperを初めて使用しようとしていて、いくつか問題があります。 私のコードは以下の通りですが、私は以下のエラーが出ます。誰かがモデルのリストをどのようにマップするかを示すことができますか?AutoMapperマッピングモデルリスト

cannot convert from 'System.Linq.IQueryable<AnonymousType#1>' to 'Entity.Product' C:\Users\Administrator\Projects\PC\trunk\PC\Controllers\AdminController.cs 37 100 PC 

public class ProductViewModel 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int UsersCount { get; set; } 
} 

var products = _repository.GetProducts(true).Select(p=> new 
                    { 
                    p.Id, 
                    p.Name, 
                    UsersCount = 0 

                    }); 

     Mapper.CreateMap<Product, ProductViewModel>(); 
     ViewData["Products"] = Mapper.Map<IEnumerable<Product>, IEnumerable<ProductViewModel>>(products); //Error appears on products object 


//Product domain model(linq2sql generated model) 
public partial class Product : INotifyPropertyChanging, INotifyPropertyChanged 
    { 

     private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs(String.Empty); 

     private int _Id; 

     private bool _Active; 

     private System.Nullable<int> _Sort; 

     private System.Nullable<int> _Category; 

     private string _Name; 

     private int _ProductTypeId; 

     private decimal _Price; 

     private System.Nullable<int> _Months; 

     private System.Nullable<int> _Credits; 

     private string _Features; 

     private string _BlockReason; 

     private string _BuyUrl1; 

     private string _BuyUrl2; 

     private bool _UsersManager; 
} 

答えて

3

LINQクエリでは、匿名オブジェクトを選択します。

IEnumerable<Product> products = _repository.GetProducts(true); 
IEnumerable<ProductViewModel> productsViewModel = Mapper.Map<IEnumerable<Product>, IEnumerable<ProductViewModel>>(products); 
return View(productsViewModel); 

また、あなたのコントローラのアクション内Mapper.CreateMap<TSource, TDest>を呼び出すことはありません:あなたは、ソースの種類(またはより具体的にIEnumerable<Product>)されている製品を選択していることを確認してください。これは、、AppDomainの寿命中に一度だけ呼び出す必要があります。Application_Startが理想的です。

また、私はViewDataを削除したことに気付きます。これは素晴らしいことです。 ViewDataは必要ありません。あなたはビューモデルで作業しています。それは彼らがやるべきことです。あなたのビューが強く型付けされた方法で必要となる情報を含みます。

+0

計算フィールドのUsersCountフィールドを作成する必要があります。上記の例では、私はUsersCount = 0を割り当てただけですが、実際のアプリではUsersを計算してUsersCountプロパティに割り当てる必要があります。多分私のデザインは間違っていますか?それを変更するには? – Tomas

+0

私はそれが間違っているかどうかあなたに伝えることができるようにあなたのデザインは何か分かりません。このフィールドはどのようにして計算されますか?あなたのドメインモデルのどの情報に依存していますか?あなたの 'Product'ドメインモデルはどのように見えますか? –

+0

私のデータベースは製品 - >ユーザーのように見えます。 GetProductsメソッドでlinqを使用してSQLにクエリを実行すると、製品のリストが表示されます。その後、特定の製品に割り当てられているユーザーの数をカウントする必要があります。だから私は新しいフィールドUsersCountを追加し、このフィールドにsqlクエリにlinqを追加してユーザーカウントを実行します。 – Tomas