拡張メソッドを使用して、自分のエンティティモデルからビューモデルに投影するのが好きです。これは、私のモデルのためのフェッチを上/下では意味しませんし、コードを素敵で読みやすいものにしています。予測にはネストされたモデルが含まれることがあり、それらのサブ予測を再利用したいと考えています。拡張メソッドを使用したEF内の単一エンティティの投影
は、私は次のような何かをできるようにしたい:実際の投影
ためctx.People.FiltersAndThings().ToViewModels();//the project my DB Models into view models
拡張メソッド
public static IQueryable<PersonModel> ToViewModels(this IQueryable<Person> entities)
{
return entities.Select(x => new PersonModel {
Me = x.Me.ToViewModel(), //this method cannot be translated into a store expression
Friends = x.Friends.AsQueryable().ToViewModels() //works fine with some magic (tm)
});
}
public static IQueryable<ProfileModel> ToViewModels(this IQueryable<Profile> entities)
{
return entities.Select(x => new ProfileModel { Name = x.Name });
}
public static ProfileModel ToViewModel(this Profile entity)
{
return new ProfileModel { Name = entity.Name };
}
照会可能を使用して(例えばFriends = x.Friends.AsQueryable().ToViewModels()
)我々は平らにするためにいくつかの魔法を使用することができますこれは式になります(https://stackoverflow.com/a/10726256/1070291、@LordTerabyteの回答を参照)。しかし、新しい節(例えばMe = new ProfileModel { Name = x.Me.Name }
)を使って代入を行うときには、式ではなく、これを拡張メソッドの下にバンドルすると(例えばMe = x.Me.ToViewModel()
)これを式にフラット化することはできません。
新しいオブジェクトへの割り当ては、EFのシーンでどのように機能しますか?
拡張メソッドを使用して新しいオブジェクトに変換する方法はありますか?ここ
完全なデモコード:https://github.com/lukemcgregor/ExtensionMethodProjection
編集:
私は今、ブログの記事(Composable Repositories - Nesting Extensions)を持っているとnuget package LINQ
あなたの現在のコードで動作しますか? –
'Me = x.Me.ToViewModel()'は動作しません。残りのデモアプリケーションをGHに投稿したいのであれば –
実際には 'Person'モデルと' PersonModel'を見るのに役立ちます。完全なコードですが、関連する部分です。 –