web-dev-qa-db-ja.com

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();

これまでに見たことのないエラーが発生します。

「LINQtoEntitiesはメソッド 'Security.Dto.RoleDto MapRole、RoleDto'メソッドを認識せず、このメソッドをストア式に変換できません」

この「問題」について何かできるかどうかはわかりません...おそらく、機能する方法の方がとにかく読みやすくなっています...

14
Jammer

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

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

[編集]ダニエルがコメントで示唆しているように、AsEnumerable()を呼び出すことで、いつでもIQueryableからIEnumerableに移動し、実行を延期することができます。

_return roles.AsEnumerable().Select(role => Mapper.Map<Role, RoleDto>(role)).ToList();
_
27
Patryk Ćwiek