2013-02-08 9 views
10

期待どおりに動作させるために何かできることがあるのでしょうか。これは私のコードでは正常に動作します:LINQとAutoMapper

 var roles = _securityContext.Set<Role>(); 
     var roleList = new List<RoleDto>(); 
     foreach (var role in roles) 
     { 
      roleList.Add(Mapper.Map<Role, RoleDto>(role)); 
     } 

     return roleList; 

しかし、これを変更する:私は前に見ていませんでしたエラーで

 var roles = _securityContext.Set<Role>(); 

     return roles.Select(role => Mapper.Map<Role, RoleDto>(role)).ToList(); 

結果:LINQはエンティティに

する」方法を認識しません'Security.Dto.RoleDto MapRole、RoleDto'メソッドで、このメソッドをストア式に変換することはできません。

この「問題」について何かできることがあるかどうかわかりません...おそらくmどんなに読みやすいですか...

答えて

21

あなたはIQueryableで作業しています。あなたが提供している方法をSQLに変換しようとしています。 AutoMapper関連の魔法を渡している間は明らかに、それは起こりません。簡単な解決策は、あなたがマッピングする前に、実行を強制する必要があります:

return roles.ToList().Select(role => Mapper.Map<Role, RoleDto>(role)).ToList(); 

[編集]ダニエルはコメントで示唆するように、あなたは常にAsEnumerable()を呼び出すことにより、IEnumerableIQueryableから行くと、まだ実行を延期することができます。

return roles.AsEnumerable().Select(role => Mapper.Map<Role, RoleDto>(role)).ToList(); 
+11

'ToList()'の代わりに 'AsEnumerable()'を使うと、遅延実行を実行するので、より良いでしょう。 –

+0

@DanielHilgarth非常に真実で、編集を追加しました。 –

+1

これは、私がオンラインで見つけたおかしな名前でなければなりません! –